diff --git a/Assets/Editor/Icons/AssetBrowser/TreeBranch_First.svg b/Assets/Editor/Icons/AssetBrowser/TreeBranch_First.svg
new file mode 100644
index 0000000000..f1d36d3e41
--- /dev/null
+++ b/Assets/Editor/Icons/AssetBrowser/TreeBranch_First.svg
@@ -0,0 +1,7 @@
+
diff --git a/Assets/Editor/Icons/AssetBrowser/TreeBranch_Last.svg b/Assets/Editor/Icons/AssetBrowser/TreeBranch_Last.svg
new file mode 100644
index 0000000000..9fc9fe52c2
--- /dev/null
+++ b/Assets/Editor/Icons/AssetBrowser/TreeBranch_Last.svg
@@ -0,0 +1,5 @@
+
diff --git a/Assets/Editor/Icons/AssetBrowser/TreeBranch_Middle.svg b/Assets/Editor/Icons/AssetBrowser/TreeBranch_Middle.svg
new file mode 100644
index 0000000000..7a61db38e0
--- /dev/null
+++ b/Assets/Editor/Icons/AssetBrowser/TreeBranch_Middle.svg
@@ -0,0 +1,6 @@
+
diff --git a/Assets/Editor/Icons/AssetBrowser/TreeBranch_OneChild.svg b/Assets/Editor/Icons/AssetBrowser/TreeBranch_OneChild.svg
new file mode 100644
index 0000000000..c6fb977c52
--- /dev/null
+++ b/Assets/Editor/Icons/AssetBrowser/TreeBranch_OneChild.svg
@@ -0,0 +1,6 @@
+
diff --git a/Assets/Editor/Translation/scriptcanvas_en_us.ts b/Assets/Editor/Translation/scriptcanvas_en_us.ts
index 937f6a4d96..7b8361c879 100644
--- a/Assets/Editor/Translation/scriptcanvas_en_us.ts
+++ b/Assets/Editor/Translation/scriptcanvas_en_us.ts
@@ -8098,7 +8098,7 @@
COLOR_FROMVALUES_PARAM0_TOOLTIP
- The Red value of hte Color [0, 255]
+ The Red value of the Color [0.0-1.0]
COLOR_FROMVALUES_PARAM1_NAME
@@ -8107,7 +8107,7 @@
COLOR_FROMVALUES_PARAM1_TOOLTIP
- The Green value of the Color [0, 255]
+ The Green value of the Color [0.0-1.0]
COLOR_FROMVALUES_PARAM2_NAME
@@ -8116,7 +8116,7 @@
COLOR_FROMVALUES_PARAM2_TOOLTIP
- The Blue value of the Color [0, 255]
+ The Blue value of the Color [0.0-1.0]
COLOR_FROMVALUES_PARAM3_NAME
@@ -8125,7 +8125,7 @@
COLOR_FROMVALUES_PARAM3_TOOLTIP
- The Alpha value of the Color [0, 255]
+ The Alpha value of the Color [0.0-1.0]
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/CMakeLists.txt
index 4a26500ee2..52682e70bb 100644
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/CMakeLists.txt
@@ -17,5 +17,14 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
AZ::AssetProcessorBatch
AZ::AssetProcessor
)
+
+ ly_add_pytest(
+ NAME AssetPipelineTests.Fbx_Tests
+ PATH ${CMAKE_CURRENT_LIST_DIR}/fbx_test/fbx_test.py
+ TEST_SUITE sandbox
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessorBatch
+ AZ::AssetProcessor
+ )
endif()
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py
index 2b90f53fc3..5cb61da68e 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py
@@ -34,11 +34,13 @@ logger = logging.getLogger(__name__)
targetProjects = ["AutomatedTesting"]
@pytest.fixture
+@pytest.mark.SUITE_sandbox
def local_resources(request, workspace, ap_setup_fixture):
ap_setup_fixture["tests_dir"] = os.path.dirname(os.path.realpath(__file__))
@dataclass
+@pytest.mark.SUITE_sandbox
class BlackboxAssetTest:
test_name: str
asset_folder: str
@@ -338,9 +340,11 @@ blackbox_fbx_special_tests = [
@pytest.mark.usefixtures("local_resources")
@pytest.mark.parametrize("project", targetProjects)
@pytest.mark.assetpipeline
+@pytest.mark.SUITE_sandbox
class TestsFBX_AllPlatforms(object):
@pytest.mark.BAT
+ @pytest.mark.SUITE_sandbox
@pytest.mark.parametrize("blackbox_param", blackbox_fbx_tests)
def test_FBXBlackboxTest_SourceFiles_Processed_ResultInExpectedProducts(self, workspace,
ap_setup_fixture, asset_processor, project,
@@ -359,6 +363,7 @@ class TestsFBX_AllPlatforms(object):
asset_processor, project, blackbox_param)
@pytest.mark.BAT
+ @pytest.mark.SUITE_sandbox
@pytest.mark.parametrize("blackbox_param", blackbox_fbx_special_tests)
def test_FBXBlackboxTest_AssetInfoModified_AssetReprocessed_ResultInExpectedProducts(self,
workspace, ap_setup_fixture,
diff --git a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp
index 18946c7874..9fe4cfd0d2 100644
--- a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp
+++ b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp
@@ -141,6 +141,10 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent)
m_ui->m_assetBrowserTreeViewWidget, &AzAssetBrowser::AssetBrowserTreeView::ClearTypeFilter, m_ui->m_searchWidget,
&AzAssetBrowser::SearchWidget::ClearTypeFilter);
+ connect(
+ this, &AzAssetBrowserWindow::SizeChangedSignal, m_ui->m_assetBrowserTableViewWidget,
+ &AzAssetBrowser::AssetBrowserTableView::UpdateSizeSlot);
+
m_ui->m_assetBrowserTreeViewWidget->SetName("AssetBrowserTreeView_main");
}
@@ -164,6 +168,25 @@ QObject* AzAssetBrowserWindow::createListenerForShowAssetEditorEvent(QObject* pa
return listener;
}
+void AzAssetBrowserWindow::resizeEvent(QResizeEvent* resizeEvent)
+{
+ // leftLayout is the parent of the tableView
+ // rightLayout is the parent of the preview window.
+ // Workaround: When docking windows this event keeps holding the old size of the widgets instead of the new one
+ // but the resizeEvent holds the new size of the whole widget
+ // So we have to save the proportions somehow
+ const QWidget* leftLayout = m_ui->m_leftLayout;
+ const QVBoxLayout* rightLayout = m_ui->m_rightLayout;
+
+ const float oldLeftLayoutWidth = aznumeric_cast(leftLayout->geometry().width());
+ const float oldWidth = aznumeric_cast(leftLayout->geometry().width() + rightLayout->geometry().width());
+
+ const float newWidth = oldLeftLayoutWidth * aznumeric_cast(resizeEvent->size().width()) / oldWidth;
+
+ emit SizeChangedSignal(aznumeric_cast(newWidth));
+ QWidget::resizeEvent(resizeEvent);
+}
+
void AzAssetBrowserWindow::OnInitViewToggleButton()
{
CreateSwitchViewMenu();
diff --git a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.h b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.h
index bf742b0cf2..753f000300 100644
--- a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.h
+++ b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.h
@@ -53,9 +53,17 @@ public:
static QObject* createListenerForShowAssetEditorEvent(QObject* parent);
+
+Q_SIGNALS:
+ void SizeChangedSignal(int newWidth);
+
+protected:
+ void resizeEvent(QResizeEvent* resizeEvent) override;
+
private:
void OnInitViewToggleButton();
void UpdateDisplayInfo();
+
protected slots:
void CreateSwitchViewMenu();
void SetExpandedAssetBrowserMode();
diff --git a/Code/Editor/Core/QtEditorApplication_linux.cpp b/Code/Editor/Core/QtEditorApplication_linux.cpp
index 175bef0238..2fd4ef629e 100644
--- a/Code/Editor/Core/QtEditorApplication_linux.cpp
+++ b/Code/Editor/Core/QtEditorApplication_linux.cpp
@@ -9,7 +9,7 @@
#include "QtEditorApplication.h"
#ifdef PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-#include
+#include
#endif
namespace Editor
@@ -19,7 +19,7 @@ namespace Editor
if (GetIEditor()->IsInGameMode())
{
#ifdef PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
- AzFramework::LinuxXcbEventHandlerBus::Broadcast(&AzFramework::LinuxXcbEventHandler::HandleXcbEvent, static_cast(message));
+ AzFramework::XcbEventHandlerBus::Broadcast(&AzFramework::XcbEventHandler::HandleXcbEvent, static_cast(message));
#endif
return true;
}
diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp
index 5b5b52d28f..dad6734428 100644
--- a/Code/Editor/EditorViewportWidget.cpp
+++ b/Code/Editor/EditorViewportWidget.cpp
@@ -2428,7 +2428,7 @@ void EditorViewportWidget::RestoreViewportAfterGameMode()
}
else
{
- AZ_Error("CryLegacy", false, "Not restoring the editor viewport camera is currently unsupported");
+ AZ_Warning("CryLegacy", false, "Not restoring the editor viewport camera is currently unsupported");
SetViewTM(preGameModeViewTM);
}
}
diff --git a/Code/Framework/AzCore/AzCore/Component/Entity.cpp b/Code/Framework/AzCore/AzCore/Component/Entity.cpp
index 00c1895261..2e92873238 100644
--- a/Code/Framework/AzCore/AzCore/Component/Entity.cpp
+++ b/Code/Framework/AzCore/AzCore/Component/Entity.cpp
@@ -207,12 +207,6 @@ namespace AZ
ActivateComponent(**it);
}
- // Cache the transform interface to the transform interface
- // Generally this pattern is not recommended unless for component event buses
- // As we have a guarantee (by design) that components can't change during active state)
- // Even though technically they can connect disconnect from the bus.
- m_transform = TransformBus::FindFirstHandler(m_id);
-
SetState(State::Active);
EBUS_EVENT_ID(m_id, EntityBus, OnEntityActivated, m_id);
@@ -1320,6 +1314,19 @@ namespace AZ
return *processSignature;
}
+ AZ::TransformInterface* Entity::GetTransform() const
+ {
+ // Lazy evaluation of the cached entity transform.
+ if(!m_transform)
+ {
+ // Generally this pattern is not recommended unless for component event buses
+ // As we have a guarantee (by design) that components can't change during active state)
+ // Even though technically they can connect disconnect from the bus.
+ m_transform = TransformBus::FindFirstHandler(m_id);
+ }
+ return m_transform;
+ }
+
//=========================================================================
// MakeId
// Ids must be unique across a project at authoring time. Runtime doesn't matter
diff --git a/Code/Framework/AzCore/AzCore/Component/Entity.h b/Code/Framework/AzCore/AzCore/Component/Entity.h
index 7ec63a56ac..356533f268 100644
--- a/Code/Framework/AzCore/AzCore/Component/Entity.h
+++ b/Code/Framework/AzCore/AzCore/Component/Entity.h
@@ -354,10 +354,9 @@ namespace AZ
//! @return The Process Signature of the local machine.
static AZ::u32 GetProcessSignature();
- /// @cond EXCLUDE_DOCS
- //! @deprecated Use the TransformBus to communicate with the TransformInterface.
- inline TransformInterface* GetTransform() const { return m_transform; }
- /// @endcond
+ //! Gets the TransformInterface for the entity.
+ //! @return The TransformInterface for the entity.
+ TransformInterface* GetTransform() const;
//! Sorts an entity's components based on the dependencies between components.
//! If all dependencies are met, the required services can be activated
@@ -406,7 +405,7 @@ namespace AZ
//! A cached pointer to the transform interface.
//! We recommend using AZ::TransformBus and caching locally instead of accessing
//! the transform interface directly through this pointer.
- TransformInterface* m_transform;
+ mutable TransformInterface* m_transform;
//! A user-friendly name for the entity. This makes error messages easier to read.
AZStd::string m_name;
diff --git a/Code/Framework/AzCore/AzCore/IO/FileReader.cpp b/Code/Framework/AzCore/AzCore/IO/FileReader.cpp
new file mode 100644
index 0000000000..94118cdfe4
--- /dev/null
+++ b/Code/Framework/AzCore/AzCore/IO/FileReader.cpp
@@ -0,0 +1,200 @@
+/*
+ * 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
+
+namespace AZ::IO
+{
+ FileReader::FileReader() = default;
+
+ FileReader::FileReader(AZ::IO::FileIOBase* fileIoBase, const char* filePath)
+ {
+ Open(fileIoBase, filePath);
+ }
+
+ FileReader::~FileReader()
+ {
+ Close();
+ }
+
+ FileReader::FileReader(FileReader&& other)
+ {
+ AZStd::swap(m_file, other.m_file);
+ AZStd::swap(m_fileIoBase, other.m_fileIoBase);
+ }
+
+ FileReader& FileReader::operator=(FileReader&& other)
+ {
+ // Close the current file and take over other file
+ Close();
+ m_file = AZStd::move(other.m_file);
+ m_fileIoBase = AZStd::move(other.m_fileIoBase);
+ other.m_file = AZStd::monostate{};
+ other.m_fileIoBase = {};
+
+ return *this;
+ }
+
+ bool FileReader::Open(AZ::IO::FileIOBase* fileIoBase, const char* filePath)
+ {
+ // Close file if the FileReader has an instance open
+ Close();
+
+ if (fileIoBase != nullptr)
+ {
+ AZ::IO::HandleType fileHandle;
+ if (fileIoBase->Open(filePath, IO::OpenMode::ModeRead, fileHandle))
+ {
+ m_file = fileHandle;
+ m_fileIoBase = fileIoBase;
+ return true;
+ }
+ }
+ else
+ {
+ AZ::IO::SystemFile file;
+ if (file.Open(filePath, IO::SystemFile::OpenMode::SF_OPEN_READ_ONLY))
+ {
+ m_file = AZStd::move(file);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool FileReader::IsOpen() const
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ return *fileHandle != AZ::IO::InvalidHandle;
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ return systemFile->IsOpen();
+ }
+
+ return false;
+ }
+
+ void FileReader::Close()
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ if (AZ::IO::FileIOBase* fileIo = m_fileIoBase; fileIo != nullptr)
+ {
+ fileIo->Close(*fileHandle);
+ }
+ }
+
+ m_file = AZStd::monostate{};
+ m_fileIoBase = {};
+ }
+
+ auto FileReader::Length() const -> SizeType
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ if (SizeType fileSize{}; m_fileIoBase->Size(*fileHandle, fileSize))
+ {
+ return fileSize;
+ }
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ return systemFile->Length();
+ }
+
+ return 0;
+ }
+
+ auto FileReader::Read(SizeType byteSize, void* buffer) -> SizeType
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ if (SizeType bytesRead{}; m_fileIoBase->Read(*fileHandle, buffer, byteSize, false, &bytesRead))
+ {
+ return bytesRead;
+ }
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ return systemFile->Read(byteSize, buffer);
+ }
+
+ return 0;
+ }
+
+ auto FileReader::Tell() const -> SizeType
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ if (SizeType fileOffset{}; m_fileIoBase->Tell(*fileHandle, fileOffset))
+ {
+ return fileOffset;
+ }
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ return systemFile->Tell();
+ }
+
+ return 0;
+ }
+
+ bool FileReader::Seek(AZ::s64 offset, SeekType type)
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ return m_fileIoBase->Seek(*fileHandle, offset, type);
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ systemFile->Seek(offset, static_cast(type));
+ return true;
+ }
+
+ return false;
+ }
+
+ bool FileReader::Eof() const
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ return m_fileIoBase->Eof(*fileHandle);
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ return systemFile->Eof();
+ }
+
+ return false;
+ }
+
+ bool FileReader::GetFilePath(AZ::IO::FixedMaxPath& filePath) const
+ {
+ if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
+ {
+ AZ::IO::FixedMaxPathString& pathStringRef = filePath.Native();
+ if (m_fileIoBase->GetFilename(*fileHandle, pathStringRef.data(), pathStringRef.capacity()))
+ {
+ pathStringRef.resize_no_construct(AZStd::char_traits::length(pathStringRef.data()));
+ return true;
+ }
+ }
+ else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
+ {
+ filePath = systemFile->Name();
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/Code/Framework/AzCore/AzCore/IO/FileReader.h b/Code/Framework/AzCore/AzCore/IO/FileReader.h
new file mode 100644
index 0000000000..4fdb18b2b2
--- /dev/null
+++ b/Code/Framework/AzCore/AzCore/IO/FileReader.h
@@ -0,0 +1,92 @@
+/*
+ * 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
+
+namespace AZ::IO
+{
+ class FileIOBase;
+ enum class SeekType : AZ::u32;
+
+ //! Structure which encapsulates delegates File Read operations
+ //! to either the FileIOBase or SystemFile classes based if a FileIOBase* instance has been supplied
+ //! to the FileSystemReader class
+ //! the SettingsRegistry option to use FileIO
+ class FileReader
+ {
+ using HandleType = AZ::u32;
+ using FileHandleType = AZStd::variant;
+ public:
+ using SizeType = AZ::u64;
+
+ //! Creates FileReader instance in the default state with no file opend
+ FileReader();
+ ~FileReader();
+
+ //! Creates a new FileReader instance and attempts to open the file at the supplied path
+ //! Uses the FileIOBase instance if supplied
+ //! @param fileIOBase pointer to fileIOBase instance
+ //! @param null-terminated filePath to open
+ FileReader(AZ::IO::FileIOBase* fileIoBase, const char* filePath);
+
+ //! Takes ownership of the supplied FileReader handle
+ FileReader(FileReader&& other);
+
+ //! Moves ownership of FileReader handle to this instance
+ FileReader& operator=(FileReader&& other);
+
+ //! Opens a File using the FileIOBase instance if non-nullptr
+ //! Otherwise fall back to use SystemFile
+ //! @param fileIOBase pointer to fileIOBase instance
+ //! @param null-terminated filePath to open
+ //! @return true if the File is opened successfully
+ bool Open(AZ::IO::FileIOBase* fileIoBase, const char* filePath);
+
+ //! Returns true if a file is currently open
+ //! @return true if the file is open
+ bool IsOpen() const;
+
+ //! Closes the File
+ void Close();
+
+ //! Retrieve the length of the OpenFile
+ SizeType Length() const;
+
+ //! Attempts to read up to byte size bytes into the supplied buffer
+ //! @param byteSize - Maximum number of bytes to read
+ //! @param buffer - Buffer to read bytes into
+ //! @returns the number of bytes read if the file is open, otherwise 0
+ SizeType Read(SizeType byteSize, void* buffer);
+
+ //! Returns the current file offset
+ //! @returns file offset if the file is open, otherwise 0
+ SizeType Tell() const;
+
+ //! Seeks within the open file to the offset supplied
+ //! @param offset File offset to seek to
+ //! @param type parameter to indicate the reference point to start the seek from
+ //! @returns true if the file is open and the seek succeeded
+ bool Seek(AZ::s64 offset, SeekType type);
+
+ //! Returns true if the file is open and in the EOF state
+ bool Eof() const;
+
+ //! Store the file path of the open file into the output file path parameter
+ //! The filePath reference is left unmodified, if the path was not stored
+ //! @return true if the filePath was stored
+ bool GetFilePath(AZ::IO::FixedMaxPath& filePath) const;
+
+ private:
+
+ FileHandleType m_file;
+ AZ::IO::FileIOBase* m_fileIoBase{};
+ };
+}
diff --git a/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp b/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp
index 5bff79b422..651abb89fe 100644
--- a/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp
+++ b/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp
@@ -160,12 +160,12 @@ void SystemFile::Seek(SeekSizeType offset, SeekMode mode)
Platform::Seek(m_handle, this, offset, mode);
}
-SystemFile::SizeType SystemFile::Tell()
+SystemFile::SizeType SystemFile::Tell() const
{
return Platform::Tell(m_handle, this);
}
-bool SystemFile::Eof()
+bool SystemFile::Eof() const
{
return Platform::Eof(m_handle, this);
}
diff --git a/Code/Framework/AzCore/AzCore/IO/SystemFile.h b/Code/Framework/AzCore/AzCore/IO/SystemFile.h
index 8a5b2b2521..551ce89ce7 100644
--- a/Code/Framework/AzCore/AzCore/IO/SystemFile.h
+++ b/Code/Framework/AzCore/AzCore/IO/SystemFile.h
@@ -72,9 +72,9 @@ namespace AZ
/// Seek in current file.
void Seek(SeekSizeType offset, SeekMode mode);
/// Get the cursor position in the current file.
- SizeType Tell();
+ SizeType Tell() const;
/// Is the cursor at the end of the file?
- bool Eof();
+ bool Eof() const;
/// Get the time the file was last modified.
AZ::u64 ModificationTime();
/// Read data from a file synchronous. Return number of bytes actually read in the buffer.
diff --git a/Code/Framework/AzCore/AzCore/Math/Transform.cpp b/Code/Framework/AzCore/AzCore/Math/Transform.cpp
index 5cb09fe9a8..1701820bae 100644
--- a/Code/Framework/AzCore/AzCore/Math/Transform.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/Transform.cpp
@@ -353,6 +353,7 @@ namespace AZ
Method("CreateFromMatrix3x3AndTranslation", &Transform::CreateFromMatrix3x3AndTranslation)->
Method("CreateUniformScale", &Transform::CreateUniformScale)->
Method("CreateTranslation", &Transform::CreateTranslation)->
+ Method("CreateLookAt", &Transform::CreateLookAt)->
Method("ConstructFromValuesNumeric", &Internal::ConstructTransformFromValues);
}
}
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp
index 7ef1fa661d..92f546815e 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp
@@ -10,6 +10,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -1116,118 +1117,6 @@ namespace AZ
}
}
- //! Structure which encapsulates Commands to either the FileIOBase or SystemFile classes based on
- //! the SettingsRegistry option to use FileIO
- struct SettingsRegistryFileReader
- {
- using FileHandleType = AZStd::variant;
-
- SettingsRegistryFileReader() = default;
- SettingsRegistryFileReader(bool useFileIo, const char* filePath)
- {
- Open(useFileIo, filePath);
- }
-
- ~SettingsRegistryFileReader()
- {
- if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
- {
- if (AZ::IO::FileIOBase* fileIo = AZ::IO::FileIOBase::GetInstance(); fileIo != nullptr)
- {
- fileIo->Close(*fileHandle);
- }
- }
- }
-
- bool Open(bool useFileIo, const char* filePath)
- {
- Close();
- if (AZ::IO::FileIOBase* fileIo = useFileIo ? AZ::IO::FileIOBase::GetInstance() : nullptr; fileIo != nullptr)
- {
- AZ::IO::HandleType fileHandle;
- if (fileIo->Open(filePath, IO::OpenMode::ModeRead, fileHandle))
- {
- m_file = fileHandle;
- return true;
- }
- }
- else
- {
- AZ::IO::SystemFile file;
- if (file.Open(filePath, IO::SystemFile::OpenMode::SF_OPEN_READ_ONLY))
- {
- m_file = AZStd::move(file);
- return true;
- }
- }
-
- return false;
- }
-
- bool IsOpen() const
- {
- if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
- {
- return *fileHandle != AZ::IO::InvalidHandle;
- }
- else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
- {
- return systemFile->IsOpen();
- }
-
- return false;
- }
-
- void Close()
- {
- if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
- {
- if (AZ::IO::FileIOBase* fileIo = AZ::IO::FileIOBase::GetInstance(); fileIo != nullptr)
- {
- fileIo->Close(*fileHandle);
- }
- }
-
- m_file = AZStd::monostate{};
- }
-
- u64 Length() const
- {
- if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
- {
- if (u64 fileSize{}; AZ::IO::FileIOBase::GetInstance()->Size(*fileHandle, fileSize))
- {
- return fileSize;
- }
- }
- else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
- {
- return systemFile->Length();
- }
-
- return 0;
- }
-
- AZ::IO::SizeType Read(AZ::IO::SizeType byteSize, void* buffer)
- {
- if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr)
- {
- if (AZ::u64 bytesRead{}; AZ::IO::FileIOBase::GetInstance()->Read(*fileHandle, buffer, byteSize, false, &bytesRead))
- {
- return bytesRead;
- }
- }
- else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr)
- {
- return systemFile->Read(byteSize, buffer);
- }
-
- return 0;
- }
-
- FileHandleType m_file;
- };
-
bool SettingsRegistryImpl::MergeSettingsFileInternal(const char* path, Format format, AZStd::string_view rootKey,
AZStd::vector& scratchBuffer)
{
@@ -1236,7 +1125,7 @@ namespace AZ
Pointer pointer(AZ_SETTINGS_REGISTRY_HISTORY_KEY "/-");
- SettingsRegistryFileReader fileReader(m_useFileIo, path);
+ FileReader fileReader(m_useFileIo ? AZ::IO::FileIOBase::GetInstance(): nullptr, path);
if (!fileReader.IsOpen())
{
AZ_Error("Settings Registry", false, R"(Unable to open registry file "%s".)", path);
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
index 5290c9b02a..da7110e36e 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
@@ -6,6 +6,8 @@
*
*/
+#include
+#include
#include
#include
#include
@@ -388,8 +390,36 @@ namespace AZ::SettingsRegistryMergeUtils
const ConfigParserSettings& configParserSettings)
{
auto configPath = FindEngineRoot(registry) / filePath;
- IO::SystemFile configFile;
- if (!configFile.Open(configPath.c_str(), IO::SystemFile::OpenMode::SF_OPEN_READ_ONLY))
+ IO::FileReader configFile;
+ bool configFileOpened{};
+ switch (configParserSettings.m_fileReaderClass)
+ {
+ case ConfigParserSettings::FileReaderClass::UseFileIOIfAvailableFallbackToSystemFile:
+ {
+ auto fileIo = AZ::IO::FileIOBase::GetInstance();
+ configFileOpened = configFile.Open(fileIo, configPath.c_str());
+ break;
+ }
+ case ConfigParserSettings::FileReaderClass::UseSystemFileOnly:
+ {
+ configFileOpened = configFile.Open(nullptr, configPath.c_str());
+ break;
+ }
+ case ConfigParserSettings::FileReaderClass::UseFileIOOnly:
+ {
+ auto fileIo = AZ::IO::FileIOBase::GetInstance();
+ if (fileIo == nullptr)
+ {
+ return false;
+ }
+ configFileOpened = configFile.Open(fileIo, configPath.c_str());
+ break;
+ }
+ default:
+ AZ_Error("SettingsRegistryMergeUtils", false, "An Invalid FileReaderClass enum value has been supplied");
+ return false;
+ }
+ if (!configFileOpened)
{
AZ_Warning("SettingsRegistryMergeUtils", false, R"(Unable to open file "%s")", configPath.c_str());
return false;
@@ -480,7 +510,7 @@ namespace AZ::SettingsRegistryMergeUtils
AZ_Error("SettingsRegistryMergeUtils", false,
R"(The config file "%s" contains a line which is longer than the max line length of %zu.)" "\n"
R"(Parsing will halt. The line content so far is:)" "\n"
- R"("%.*s")" "\n", configFile.Name(), configBuffer.max_size(),
+ R"("%.*s")" "\n", configPath.c_str(), configBuffer.max_size(),
aznumeric_cast(configBuffer.size()), configBuffer.data());
configFileParsed = false;
break;
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
index 02346c2ba1..daa64c0343 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
@@ -155,6 +155,15 @@ namespace AZ::SettingsRegistryMergeUtils
//! structure which is forwarded to the SettingsRegistryInterface MergeCommandLineArgument function
//! The structure contains a functor which returns true if a character is a valid delimiter
SettingsRegistryInterface::CommandLineArgumentSettings m_commandLineSettings;
+
+ //! enumeration to indicate if AZ::IO::FileIOBase should be used to open the config file over AZ::IO::SystemFile
+ enum class FileReaderClass
+ {
+ UseFileIOIfAvailableFallbackToSystemFile,
+ UseSystemFileOnly,
+ UseFileIOOnly
+ };
+ FileReaderClass m_fileReaderClass = FileReaderClass::UseFileIOIfAvailableFallbackToSystemFile;
};
//! Loads basic configuration files which have structures similar to Windows INI files
//! It is inspired by the Python configparser module: https://docs.python.org/3.10/library/configparser.html
diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake
index 6c498c3335..aa07959997 100644
--- a/Code/Framework/AzCore/AzCore/azcore_files.cmake
+++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake
@@ -166,6 +166,8 @@ set(FILES
IO/FileIO.cpp
IO/FileIO.h
IO/FileIOEventBus.h
+ IO/FileReader.cpp
+ IO/FileReader.h
IO/IOUtils.h
IO/IOUtils.cpp
IO/IStreamer.h
diff --git a/Code/Framework/AzCore/Tests/IO/FileReaderTests.cpp b/Code/Framework/AzCore/Tests/IO/FileReaderTests.cpp
new file mode 100644
index 0000000000..691b3f2821
--- /dev/null
+++ b/Code/Framework/AzCore/Tests/IO/FileReaderTests.cpp
@@ -0,0 +1,72 @@
+/*
+ * 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
+
+namespace UnitTest
+{
+ template
+ class FileReaderTestFixture
+ : public ScopedAllocatorSetupFixture
+ {
+ public:
+ void SetUp() override
+ {
+ if constexpr (AZStd::is_same_v)
+ {
+ m_fileIo = AZStd::make_unique();
+ }
+ }
+
+ void TearDown() override
+ {
+ m_fileIo.reset();
+ }
+
+ protected:
+ AZStd::unique_ptr m_fileIo{};
+ };
+
+ using FileIOTypes = ::testing::Types;
+
+ TYPED_TEST_CASE(FileReaderTestFixture, FileIOTypes);
+
+ TYPED_TEST(FileReaderTestFixture, ConstructorWithFilePath_OpensFileSuccessfully)
+ {
+ AZ::IO::FileReader fileReader(this->m_fileIo.get(), AZ::IO::SystemFile::GetNullFilename());
+ EXPECT_TRUE(fileReader.IsOpen());
+ }
+
+ TYPED_TEST(FileReaderTestFixture, Open_OpensFileSucessfully)
+ {
+ AZ::IO::FileReader fileReader;
+ fileReader.Open(this->m_fileIo.get(), AZ::IO::SystemFile::GetNullFilename());
+ EXPECT_TRUE(fileReader.IsOpen());
+ }
+
+ TYPED_TEST(FileReaderTestFixture, Eof_OnNULDeviceFile_Succeeds)
+ {
+ AZ::IO::FileReader fileReader(this->m_fileIo.get(), AZ::IO::SystemFile::GetNullFilename());
+ EXPECT_TRUE(fileReader.Eof());
+ }
+
+ TYPED_TEST(FileReaderTestFixture, GetFilePath_ReturnsNULDeviceFilename_Succeeds)
+ {
+ AZ::IO::FileReader fileReader(this->m_fileIo.get(), AZ::IO::SystemFile::GetNullFilename());
+ AZ::IO::FixedMaxPath filePath;
+ EXPECT_TRUE(fileReader.GetFilePath(filePath));
+ AZ::IO::FixedMaxPath nulFilename{ AZ::IO::SystemFile::GetNullFilename() };
+ if (this->m_fileIo)
+ {
+ EXPECT_TRUE(this->m_fileIo->ResolvePath(nulFilename, nulFilename));
+ }
+ EXPECT_EQ(nulFilename, filePath);
+ }
+
+} // namespace UnitTest
diff --git a/Code/Framework/AzCore/Tests/azcoretests_files.cmake b/Code/Framework/AzCore/Tests/azcoretests_files.cmake
index d4d107f094..c36d37d874 100644
--- a/Code/Framework/AzCore/Tests/azcoretests_files.cmake
+++ b/Code/Framework/AzCore/Tests/azcoretests_files.cmake
@@ -37,6 +37,7 @@ set(FILES
FileIOBaseTestTypes.h
Geometry2DUtils.cpp
Interface.cpp
+ IO/FileReaderTests.cpp
IO/Path/PathTests.cpp
IPC.cpp
Jobs.cpp
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.cpp b/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.cpp
index cc6154f20c..496d89d767 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.cpp
@@ -28,34 +28,10 @@ namespace AzFramework
}
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- InputChannelId::InputChannelId(const char* name)
- : m_crc32(name)
- {
- memset(m_name, 0, AZ_ARRAY_SIZE(m_name));
- azstrncpy(m_name, NAME_BUFFER_SIZE, name, MAX_NAME_LENGTH);
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- InputChannelId::InputChannelId(const InputChannelId& other)
- : m_crc32(other.m_crc32)
- {
- memset(m_name, 0, AZ_ARRAY_SIZE(m_name));
- azstrcpy(m_name, NAME_BUFFER_SIZE, other.m_name);
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- InputChannelId& InputChannelId::operator=(const InputChannelId& other)
- {
- azstrcpy(m_name, NAME_BUFFER_SIZE, other.m_name);
- m_crc32 = other.m_crc32;
- return *this;
- }
-
////////////////////////////////////////////////////////////////////////////////////////////////
const char* InputChannelId::GetName() const
{
- return m_name;
+ return m_name.c_str();
}
////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.h b/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.h
index 5c1c58d6b1..a4d8ac83eb 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Channels/InputChannelId.h
@@ -11,6 +11,7 @@
#include
#include
#include
+#include
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace AzFramework
@@ -22,8 +23,7 @@ namespace AzFramework
public:
////////////////////////////////////////////////////////////////////////////////////////////
// Constants
- static const int NAME_BUFFER_SIZE = 64;
- static const int MAX_NAME_LENGTH = NAME_BUFFER_SIZE - 1;
+ static constexpr int MAX_NAME_LENGTH = 64;
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
@@ -39,21 +39,28 @@ namespace AzFramework
////////////////////////////////////////////////////////////////////////////////////////////
//! Constructor
- //! \param[in] name Name of the input channel (will be truncated if exceeds MAX_NAME_LENGTH)
- explicit InputChannelId(const char* name = "");
+ //! \param[in] name Name of the input channel (will be ignored if exceeds MAX_NAME_LENGTH)
+ explicit constexpr InputChannelId(AZStd::string_view name = "")
+ : m_name(name)
+ , m_crc32(name)
+ {
+ }
- ////////////////////////////////////////////////////////////////////////////////////////////
- //! Copy constructor
- //! \param[in] other Another instance of the class to copy from
- InputChannelId(const InputChannelId& other);
-
- ////////////////////////////////////////////////////////////////////////////////////////////
- //! Copy assignment operator
- //! \param[in] other Another instance of the class to copy from
- InputChannelId& operator=(const InputChannelId& other);
-
- ////////////////////////////////////////////////////////////////////////////////////////////
- //! Default destructor
+ constexpr InputChannelId(const InputChannelId& other) = default;
+ constexpr InputChannelId(InputChannelId&& other) = default;
+ constexpr InputChannelId& operator=(const InputChannelId& other)
+ {
+ m_name = other.m_name;
+ m_crc32 = other.m_crc32;
+ return *this;
+ }
+ constexpr InputChannelId& operator=(InputChannelId&& other)
+ {
+ m_name = AZStd::move(other.m_name);
+ m_crc32 = AZStd::move(other.m_crc32);
+ other.m_crc32 = 0;
+ return *this;
+ }
~InputChannelId() = default;
////////////////////////////////////////////////////////////////////////////////////////////
@@ -77,7 +84,7 @@ namespace AzFramework
private:
////////////////////////////////////////////////////////////////////////////////////////////
// Variables
- char m_name[NAME_BUFFER_SIZE]; //!< Name of the input channel
+ AZStd::fixed_string m_name; //!< Name of the input channel
AZ::Crc32 m_crc32; //!< Crc32 of the input channel
};
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.cpp
index 95886c6871..51aa008519 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.cpp
@@ -28,91 +28,6 @@ namespace AzFramework
return (inputDeviceId.GetNameCrc32() == IdForIndex0.GetNameCrc32());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceGamepad::Button::A("gamepad_button_a");
- const InputChannelId InputDeviceGamepad::Button::B("gamepad_button_b");
- const InputChannelId InputDeviceGamepad::Button::X("gamepad_button_x");
- const InputChannelId InputDeviceGamepad::Button::Y("gamepad_button_y");
- const InputChannelId InputDeviceGamepad::Button::L1("gamepad_button_l1");
- const InputChannelId InputDeviceGamepad::Button::R1("gamepad_button_r1");
- const InputChannelId InputDeviceGamepad::Button::L3("gamepad_button_l3");
- const InputChannelId InputDeviceGamepad::Button::R3("gamepad_button_r3");
- const InputChannelId InputDeviceGamepad::Button::DU("gamepad_button_d_up");
- const InputChannelId InputDeviceGamepad::Button::DD("gamepad_button_d_down");
- const InputChannelId InputDeviceGamepad::Button::DL("gamepad_button_d_left");
- const InputChannelId InputDeviceGamepad::Button::DR("gamepad_button_d_right");
- const InputChannelId InputDeviceGamepad::Button::Start("gamepad_button_start");
- const InputChannelId InputDeviceGamepad::Button::Select("gamepad_button_select");
- const AZStd::array InputDeviceGamepad::Button::All =
- {{
- A,
- B,
- X,
- Y,
- L1,
- R1,
- L3,
- R3,
- DU,
- DD,
- DL,
- DR,
- Start,
- Select
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceGamepad::Trigger::L2("gamepad_trigger_l2");
- const InputChannelId InputDeviceGamepad::Trigger::R2("gamepad_trigger_r2");
- const AZStd::array InputDeviceGamepad::Trigger::All =
- {{
- L2,
- R2
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceGamepad::ThumbStickAxis2D::L("gamepad_thumbstick_l");
- const InputChannelId InputDeviceGamepad::ThumbStickAxis2D::R("gamepad_thumbstick_r");
- const AZStd::array InputDeviceGamepad::ThumbStickAxis2D::All =
- {{
- L,
- R
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceGamepad::ThumbStickAxis1D::LX("gamepad_thumbstick_l_x");
- const InputChannelId InputDeviceGamepad::ThumbStickAxis1D::LY("gamepad_thumbstick_l_y");
- const InputChannelId InputDeviceGamepad::ThumbStickAxis1D::RX("gamepad_thumbstick_r_x");
- const InputChannelId InputDeviceGamepad::ThumbStickAxis1D::RY("gamepad_thumbstick_r_y");
- const AZStd::array InputDeviceGamepad::ThumbStickAxis1D::All =
- {{
- LX,
- LY,
- RX,
- RY
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::LU("gamepad_thumbstick_l_up");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::LD("gamepad_thumbstick_l_down");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::LL("gamepad_thumbstick_l_left");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::LR("gamepad_thumbstick_l_right");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::RU("gamepad_thumbstick_r_up");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::RD("gamepad_thumbstick_r_down");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::RL("gamepad_thumbstick_r_left");
- const InputChannelId InputDeviceGamepad::ThumbStickDirection::RR("gamepad_thumbstick_r_right");
- const AZStd::array InputDeviceGamepad::ThumbStickDirection::All =
- {{
- LU,
- LD,
- LL,
- LR,
- RU,
- RD,
- RL,
- RR
- }};
-
////////////////////////////////////////////////////////////////////////////////////////////////
void InputDeviceGamepad::Reflect(AZ::ReflectContext* context)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h b/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h
index f4fddbb24e..286b4f0df3 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad.h
@@ -59,75 +59,115 @@ namespace AzFramework
//! All the input channel ids that identify game-pad digital button input
struct Button
{
- static const InputChannelId A; //!< The bottom diamond face button
- static const InputChannelId B; //!< The right diamond face button
- static const InputChannelId X; //!< The left diamond face button
- static const InputChannelId Y; //!< The top diamond face button
- static const InputChannelId L1; //!< The top-left shoulder bumper button
- static const InputChannelId R1; //!< The top-right shoulder bumper button
- static const InputChannelId L3; //!< The left thumb-stick click button
- static const InputChannelId R3; //!< The right thumb-stick click button
- static const InputChannelId DU; //!< The up directional pad button
- static const InputChannelId DD; //!< The down directional pad button
- static const InputChannelId DL; //!< The left directional pad button
- static const InputChannelId DR; //!< The right directional pad button
- static const InputChannelId Start; //!< The start/pause/options button
- static const InputChannelId Select; //!< The select/back button
+ static constexpr inline InputChannelId A{"gamepad_button_a"}; //!< The bottom diamond face button
+ static constexpr inline InputChannelId B{"gamepad_button_b"}; //!< The right diamond face button
+ static constexpr inline InputChannelId X{"gamepad_button_x"}; //!< The left diamond face button
+ static constexpr inline InputChannelId Y{"gamepad_button_y"}; //!< The top diamond face button
+ static constexpr inline InputChannelId L1{"gamepad_button_l1"}; //!< The top-left shoulder bumper button
+ static constexpr inline InputChannelId R1{"gamepad_button_r1"}; //!< The top-right shoulder bumper button
+ static constexpr inline InputChannelId L3{"gamepad_button_l3"}; //!< The left thumb-stick click button
+ static constexpr inline InputChannelId R3{"gamepad_button_r3"}; //!< The right thumb-stick click button
+ static constexpr inline InputChannelId DU{"gamepad_button_d_up"}; //!< The up directional pad button
+ static constexpr inline InputChannelId DD{"gamepad_button_d_down"}; //!< The down directional pad button
+ static constexpr inline InputChannelId DL{"gamepad_button_d_left"}; //!< The left directional pad button
+ static constexpr inline InputChannelId DR{"gamepad_button_d_right"}; //!< The right directional pad button
+ static constexpr inline InputChannelId Start{"gamepad_button_start"}; //!< The start/pause/options button
+ static constexpr inline InputChannelId Select{"gamepad_button_select"}; //!< The select/back button
//!< All digital game-pad button ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ A,
+ B,
+ X,
+ Y,
+ L1,
+ R1,
+ L3,
+ R3,
+ DU,
+ DD,
+ DL,
+ DR,
+ Start,
+ Select
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
//! All the input channel ids that identify game-pad analog trigger input
struct Trigger
{
- static const InputChannelId L2; //!< The bottom-left shoulder trigger
- static const InputChannelId R2; //!< The bottom-right shoulder trigger
+ static constexpr inline InputChannelId L2{"gamepad_trigger_l2"}; //!< The bottom-left shoulder trigger
+ static constexpr inline InputChannelId R2{"gamepad_trigger_r2"}; //!< The bottom-right shoulder trigger
//!< All analog game-pad trigger ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ L2,
+ R2
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
//! All the input channel ids that identify game-pad thumb-stick 2D axis input
struct ThumbStickAxis2D
{
- static const InputChannelId L; //!< The left-hand thumb-stick
- static const InputChannelId R; //!< The right-hand thumb-stick
+ static constexpr inline InputChannelId L{"gamepad_thumbstick_l"}; //!< The left-hand thumb-stick
+ static constexpr inline InputChannelId R{"gamepad_thumbstick_r"}; //!< The right-hand thumb-stick
//!< All game-pad thumb-stick 2D axis input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ L,
+ R
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
//! All the input channel ids that identify game-pad thumb-stick 1D axis input
struct ThumbStickAxis1D
{
- static const InputChannelId LX; //!< X-axis of the left-hand thumb-stick
- static const InputChannelId LY; //!< Y-axis of the left-hand thumb-stick
- static const InputChannelId RX; //!< X-axis of the right-hand thumb-stick
- static const InputChannelId RY; //!< Y-axis of the right-hand thumb-stick
+ static constexpr inline InputChannelId LX{"gamepad_thumbstick_l_x"}; //!< X-axis of the left-hand thumb-stick
+ static constexpr inline InputChannelId LY{"gamepad_thumbstick_l_y"}; //!< Y-axis of the left-hand thumb-stick
+ static constexpr inline InputChannelId RX{"gamepad_thumbstick_r_x"}; //!< X-axis of the right-hand thumb-stick
+ static constexpr inline InputChannelId RY{"gamepad_thumbstick_r_y"}; //!< Y-axis of the right-hand thumb-stick
//!< All game-pad thumb-stick 1D axis input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ LX,
+ LY,
+ RX,
+ RY
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
//! All the input channel ids that identify game-pad thumb-stick directional input
struct ThumbStickDirection
{
- static const InputChannelId LU; //!< Up on the left-hand thumb-stick
- static const InputChannelId LD; //!< Down on the left-hand thumb-stick
- static const InputChannelId LL; //!< Left on the left-hand thumb-stick
- static const InputChannelId LR; //!< Right on the left-hand thumb-stick
- static const InputChannelId RU; //!< Up on the left-hand thumb-stick
- static const InputChannelId RD; //!< Down on the left-hand thumb-stick
- static const InputChannelId RL; //!< Left on the left-hand thumb-stick
- static const InputChannelId RR; //!< Right on the left-hand thumb-stick
+ static constexpr inline InputChannelId LU{"gamepad_thumbstick_l_up"}; //!< Up on the left-hand thumb-stick
+ static constexpr inline InputChannelId LD{"gamepad_thumbstick_l_down"}; //!< Down on the left-hand thumb-stick
+ static constexpr inline InputChannelId LL{"gamepad_thumbstick_l_left"}; //!< Left on the left-hand thumb-stick
+ static constexpr inline InputChannelId LR{"gamepad_thumbstick_l_right"}; //!< Right on the left-hand thumb-stick
+ static constexpr inline InputChannelId RU{"gamepad_thumbstick_r_up"}; //!< Up on the left-hand thumb-stick
+ static constexpr inline InputChannelId RD{"gamepad_thumbstick_r_down"}; //!< Down on the left-hand thumb-stick
+ static constexpr inline InputChannelId RL{"gamepad_thumbstick_r_left"}; //!< Left on the left-hand thumb-stick
+ static constexpr inline InputChannelId RR{"gamepad_thumbstick_r_right"}; //!< Right on the left-hand thumb-stick
//!< All game-pad thumb-stick directional input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ LU,
+ LD,
+ LL,
+ LR,
+ RU,
+ RD,
+ RL,
+ RR
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.cpp
index dd84fd9633..d1117ea895 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.cpp
@@ -24,279 +24,6 @@ namespace AzFramework
return (inputDeviceId.GetNameCrc32() == Id.GetNameCrc32());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Alphanumeric Keys
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric0("keyboard_key_alphanumeric_0");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric1("keyboard_key_alphanumeric_1");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric2("keyboard_key_alphanumeric_2");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric3("keyboard_key_alphanumeric_3");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric4("keyboard_key_alphanumeric_4");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric5("keyboard_key_alphanumeric_5");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric6("keyboard_key_alphanumeric_6");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric7("keyboard_key_alphanumeric_7");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric8("keyboard_key_alphanumeric_8");
- const InputChannelId InputDeviceKeyboard::Key::Alphanumeric9("keyboard_key_alphanumeric_9");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericA("keyboard_key_alphanumeric_A");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericB("keyboard_key_alphanumeric_B");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericC("keyboard_key_alphanumeric_C");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericD("keyboard_key_alphanumeric_D");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericE("keyboard_key_alphanumeric_E");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericF("keyboard_key_alphanumeric_F");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericG("keyboard_key_alphanumeric_G");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericH("keyboard_key_alphanumeric_H");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericI("keyboard_key_alphanumeric_I");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericJ("keyboard_key_alphanumeric_J");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericK("keyboard_key_alphanumeric_K");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericL("keyboard_key_alphanumeric_L");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericM("keyboard_key_alphanumeric_M");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericN("keyboard_key_alphanumeric_N");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericO("keyboard_key_alphanumeric_O");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericP("keyboard_key_alphanumeric_P");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericQ("keyboard_key_alphanumeric_Q");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericR("keyboard_key_alphanumeric_R");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericS("keyboard_key_alphanumeric_S");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericT("keyboard_key_alphanumeric_T");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericU("keyboard_key_alphanumeric_U");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericV("keyboard_key_alphanumeric_V");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericW("keyboard_key_alphanumeric_W");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericX("keyboard_key_alphanumeric_X");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericY("keyboard_key_alphanumeric_Y");
- const InputChannelId InputDeviceKeyboard::Key::AlphanumericZ("keyboard_key_alphanumeric_Z");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Edit (and escape) Keys
- const InputChannelId InputDeviceKeyboard::Key::EditBackspace("keyboard_key_edit_backspace");
- const InputChannelId InputDeviceKeyboard::Key::EditCapsLock("keyboard_key_edit_capslock");
- const InputChannelId InputDeviceKeyboard::Key::EditEnter("keyboard_key_edit_enter");
- const InputChannelId InputDeviceKeyboard::Key::EditSpace("keyboard_key_edit_space");
- const InputChannelId InputDeviceKeyboard::Key::EditTab("keyboard_key_edit_tab");
- const InputChannelId InputDeviceKeyboard::Key::Escape("keyboard_key_escape");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Function Keys
- const InputChannelId InputDeviceKeyboard::Key::Function01("keyboard_key_function_F01");
- const InputChannelId InputDeviceKeyboard::Key::Function02("keyboard_key_function_F02");
- const InputChannelId InputDeviceKeyboard::Key::Function03("keyboard_key_function_F03");
- const InputChannelId InputDeviceKeyboard::Key::Function04("keyboard_key_function_F04");
- const InputChannelId InputDeviceKeyboard::Key::Function05("keyboard_key_function_F05");
- const InputChannelId InputDeviceKeyboard::Key::Function06("keyboard_key_function_F06");
- const InputChannelId InputDeviceKeyboard::Key::Function07("keyboard_key_function_F07");
- const InputChannelId InputDeviceKeyboard::Key::Function08("keyboard_key_function_F08");
- const InputChannelId InputDeviceKeyboard::Key::Function09("keyboard_key_function_F09");
- const InputChannelId InputDeviceKeyboard::Key::Function10("keyboard_key_function_F10");
- const InputChannelId InputDeviceKeyboard::Key::Function11("keyboard_key_function_F11");
- const InputChannelId InputDeviceKeyboard::Key::Function12("keyboard_key_function_F12");
- const InputChannelId InputDeviceKeyboard::Key::Function13("keyboard_key_function_F13");
- const InputChannelId InputDeviceKeyboard::Key::Function14("keyboard_key_function_F14");
- const InputChannelId InputDeviceKeyboard::Key::Function15("keyboard_key_function_F15");
- const InputChannelId InputDeviceKeyboard::Key::Function16("keyboard_key_function_F16");
- const InputChannelId InputDeviceKeyboard::Key::Function17("keyboard_key_function_F17");
- const InputChannelId InputDeviceKeyboard::Key::Function18("keyboard_key_function_F18");
- const InputChannelId InputDeviceKeyboard::Key::Function19("keyboard_key_function_F19");
- const InputChannelId InputDeviceKeyboard::Key::Function20("keyboard_key_function_F20");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Modifier Keys
- const InputChannelId InputDeviceKeyboard::Key::ModifierAltL("keyboard_key_modifier_alt_l");
- const InputChannelId InputDeviceKeyboard::Key::ModifierAltR("keyboard_key_modifier_alt_r");
- const InputChannelId InputDeviceKeyboard::Key::ModifierCtrlL("keyboard_key_modifier_ctrl_l");
- const InputChannelId InputDeviceKeyboard::Key::ModifierCtrlR("keyboard_key_modifier_ctrl_r");
- const InputChannelId InputDeviceKeyboard::Key::ModifierShiftL("keyboard_key_modifier_shift_l");
- const InputChannelId InputDeviceKeyboard::Key::ModifierShiftR("keyboard_key_modifier_shift_r");
- const InputChannelId InputDeviceKeyboard::Key::ModifierSuperL("keyboard_key_modifier_super_l");
- const InputChannelId InputDeviceKeyboard::Key::ModifierSuperR("keyboard_key_modifier_super_r");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Navigation Keys
- const InputChannelId InputDeviceKeyboard::Key::NavigationArrowDown("keyboard_key_navigation_arrow_down");
- const InputChannelId InputDeviceKeyboard::Key::NavigationArrowLeft("keyboard_key_navigation_arrow_left");
- const InputChannelId InputDeviceKeyboard::Key::NavigationArrowRight("keyboard_key_navigation_arrow_right");
- const InputChannelId InputDeviceKeyboard::Key::NavigationArrowUp("keyboard_key_navigation_arrow_up");
- const InputChannelId InputDeviceKeyboard::Key::NavigationDelete("keyboard_key_navigation_delete");
- const InputChannelId InputDeviceKeyboard::Key::NavigationEnd("keyboard_key_navigation_end");
- const InputChannelId InputDeviceKeyboard::Key::NavigationHome("keyboard_key_navigation_home");
- const InputChannelId InputDeviceKeyboard::Key::NavigationInsert("keyboard_key_navigation_insert");
- const InputChannelId InputDeviceKeyboard::Key::NavigationPageDown("keyboard_key_navigation_page_down");
- const InputChannelId InputDeviceKeyboard::Key::NavigationPageUp("keyboard_key_navigation_page_up");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Numpad Keys
- const InputChannelId InputDeviceKeyboard::Key::NumLock("keyboard_key_num_lock");
- const InputChannelId InputDeviceKeyboard::Key::NumPad0("keyboard_key_numpad_0");
- const InputChannelId InputDeviceKeyboard::Key::NumPad1("keyboard_key_numpad_1");
- const InputChannelId InputDeviceKeyboard::Key::NumPad2("keyboard_key_numpad_2");
- const InputChannelId InputDeviceKeyboard::Key::NumPad3("keyboard_key_numpad_3");
- const InputChannelId InputDeviceKeyboard::Key::NumPad4("keyboard_key_numpad_4");
- const InputChannelId InputDeviceKeyboard::Key::NumPad5("keyboard_key_numpad_5");
- const InputChannelId InputDeviceKeyboard::Key::NumPad6("keyboard_key_numpad_6");
- const InputChannelId InputDeviceKeyboard::Key::NumPad7("keyboard_key_numpad_7");
- const InputChannelId InputDeviceKeyboard::Key::NumPad8("keyboard_key_numpad_8");
- const InputChannelId InputDeviceKeyboard::Key::NumPad9("keyboard_key_numpad_9");
- const InputChannelId InputDeviceKeyboard::Key::NumPadAdd("keyboard_key_numpad_add");
- const InputChannelId InputDeviceKeyboard::Key::NumPadDecimal("keyboard_key_numpad_decimal");
- const InputChannelId InputDeviceKeyboard::Key::NumPadDivide("keyboard_key_numpad_divide");
- const InputChannelId InputDeviceKeyboard::Key::NumPadEnter("keyboard_key_numpad_enter");
- const InputChannelId InputDeviceKeyboard::Key::NumPadMultiply("keyboard_key_numpad_multiply");
- const InputChannelId InputDeviceKeyboard::Key::NumPadSubtract("keyboard_key_numpad_subtract");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Punctuation Keys
- const InputChannelId InputDeviceKeyboard::Key::PunctuationApostrophe("keyboard_key_punctuation_apostrophe");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationBackslash("keyboard_key_punctuation_backslash");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationBracketL("keyboard_key_punctuation_bracket_l");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationBracketR("keyboard_key_punctuation_bracket_r");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationComma("keyboard_key_punctuation_comma");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationEquals("keyboard_key_punctuation_equals");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationHyphen("keyboard_key_punctuation_hyphen");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationPeriod("keyboard_key_punctuation_period");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationSemicolon("keyboard_key_punctuation_semicolon");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationSlash("keyboard_key_punctuation_slash");
- const InputChannelId InputDeviceKeyboard::Key::PunctuationTilde("keyboard_key_punctuation_tilde");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Supplementary ISO Key
- const InputChannelId InputDeviceKeyboard::Key::SupplementaryISO("keyboard_key_supplementary_iso");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // Windows System Keys
- const InputChannelId InputDeviceKeyboard::Key::WindowsSystemPause("keyboard_key_windows_system_pause");
- const InputChannelId InputDeviceKeyboard::Key::WindowsSystemPrint("keyboard_key_windows_system_print");
- const InputChannelId InputDeviceKeyboard::Key::WindowsSystemScrollLock("keyboard_key_windows_system_scroll_lock");
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const AZStd::array InputDeviceKeyboard::Key::All =
- {{
- // Alphanumeric Keys
- Alphanumeric0,
- Alphanumeric1,
- Alphanumeric2,
- Alphanumeric3,
- Alphanumeric4,
- Alphanumeric5,
- Alphanumeric6,
- Alphanumeric7,
- Alphanumeric8,
- Alphanumeric9,
- AlphanumericA,
- AlphanumericB,
- AlphanumericC,
- AlphanumericD,
- AlphanumericE,
- AlphanumericF,
- AlphanumericG,
- AlphanumericH,
- AlphanumericI,
- AlphanumericJ,
- AlphanumericK,
- AlphanumericL,
- AlphanumericM,
- AlphanumericN,
- AlphanumericO,
- AlphanumericP,
- AlphanumericQ,
- AlphanumericR,
- AlphanumericS,
- AlphanumericT,
- AlphanumericU,
- AlphanumericV,
- AlphanumericW,
- AlphanumericX,
- AlphanumericY,
- AlphanumericZ,
-
- // Edit (and escape) Keys
- EditBackspace,
- EditCapsLock,
- EditEnter,
- EditSpace,
- EditTab,
- Escape,
-
- // Function Keys
- Function01,
- Function02,
- Function03,
- Function04,
- Function05,
- Function06,
- Function07,
- Function08,
- Function09,
- Function10,
- Function11,
- Function12,
- Function13,
- Function14,
- Function15,
- Function16,
- Function17,
- Function18,
- Function19,
- Function20,
-
- // Modifier Keys
- ModifierAltL,
- ModifierAltR,
- ModifierCtrlL,
- ModifierCtrlR,
- ModifierShiftL,
- ModifierShiftR,
- ModifierSuperL,
- ModifierSuperR,
-
- // Navigation Keys
- NavigationArrowDown,
- NavigationArrowLeft,
- NavigationArrowRight,
- NavigationArrowUp,
- NavigationDelete,
- NavigationEnd,
- NavigationHome,
- NavigationInsert,
- NavigationPageDown,
- NavigationPageUp,
-
- // Numpad Keys
- NumLock,
- NumPad0,
- NumPad1,
- NumPad2,
- NumPad3,
- NumPad4,
- NumPad5,
- NumPad6,
- NumPad7,
- NumPad8,
- NumPad9,
- NumPadAdd,
- NumPadDecimal,
- NumPadDivide,
- NumPadEnter,
- NumPadMultiply,
- NumPadSubtract,
-
- // Punctuation Keys
- PunctuationApostrophe,
- PunctuationBackslash,
- PunctuationBracketL,
- PunctuationBracketR,
- PunctuationComma,
- PunctuationEquals,
- PunctuationHyphen,
- PunctuationPeriod,
- PunctuationSemicolon,
- PunctuationSlash,
- PunctuationTilde,
-
- // Supplementary ISO Key
- SupplementaryISO,
-
- // Windows System Keys
- WindowsSystemPause,
- WindowsSystemPrint,
- WindowsSystemScrollLock
- }};
-
////////////////////////////////////////////////////////////////////////////////////////////////
ModifierKeyMask GetCorrespondingModifierKeyMask(const InputChannelId& channelId)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h b/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h
index 5588f94d69..e3c21ec326 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h
@@ -94,137 +94,268 @@ namespace AzFramework
struct Key
{
// Alphanumeric Keys
- static const InputChannelId Alphanumeric0; //!< The 0 key
- static const InputChannelId Alphanumeric1; //!< The 1 key
- static const InputChannelId Alphanumeric2; //!< The 2 key
- static const InputChannelId Alphanumeric3; //!< The 3 key
- static const InputChannelId Alphanumeric4; //!< The 4 key
- static const InputChannelId Alphanumeric5; //!< The 5 key
- static const InputChannelId Alphanumeric6; //!< The 6 key
- static const InputChannelId Alphanumeric7; //!< The 7 key
- static const InputChannelId Alphanumeric8; //!< The 8 key
- static const InputChannelId Alphanumeric9; //!< The 9 key
- static const InputChannelId AlphanumericA; //!< The A key
- static const InputChannelId AlphanumericB; //!< The B key
- static const InputChannelId AlphanumericC; //!< The C key
- static const InputChannelId AlphanumericD; //!< The D key
- static const InputChannelId AlphanumericE; //!< The E key
- static const InputChannelId AlphanumericF; //!< The F key
- static const InputChannelId AlphanumericG; //!< The G key
- static const InputChannelId AlphanumericH; //!< The H key
- static const InputChannelId AlphanumericI; //!< The I key
- static const InputChannelId AlphanumericJ; //!< The J key
- static const InputChannelId AlphanumericK; //!< The K key
- static const InputChannelId AlphanumericL; //!< The L key
- static const InputChannelId AlphanumericM; //!< The M key
- static const InputChannelId AlphanumericN; //!< The N key
- static const InputChannelId AlphanumericO; //!< The O key
- static const InputChannelId AlphanumericP; //!< The P key
- static const InputChannelId AlphanumericQ; //!< The Q key
- static const InputChannelId AlphanumericR; //!< The R key
- static const InputChannelId AlphanumericS; //!< The S key
- static const InputChannelId AlphanumericT; //!< The T key
- static const InputChannelId AlphanumericU; //!< The U key
- static const InputChannelId AlphanumericV; //!< The V key
- static const InputChannelId AlphanumericW; //!< The W key
- static const InputChannelId AlphanumericX; //!< The X key
- static const InputChannelId AlphanumericY; //!< The Y key
- static const InputChannelId AlphanumericZ; //!< The Z key
+ static constexpr inline InputChannelId Alphanumeric0{"keyboard_key_alphanumeric_0"}; //!< The 0 key
+ static constexpr inline InputChannelId Alphanumeric1{"keyboard_key_alphanumeric_1"}; //!< The 1 key
+ static constexpr inline InputChannelId Alphanumeric2{"keyboard_key_alphanumeric_2"}; //!< The 2 key
+ static constexpr inline InputChannelId Alphanumeric3{"keyboard_key_alphanumeric_3"}; //!< The 3 key
+ static constexpr inline InputChannelId Alphanumeric4{"keyboard_key_alphanumeric_4"}; //!< The 4 key
+ static constexpr inline InputChannelId Alphanumeric5{"keyboard_key_alphanumeric_5"}; //!< The 5 key
+ static constexpr inline InputChannelId Alphanumeric6{"keyboard_key_alphanumeric_6"}; //!< The 6 key
+ static constexpr inline InputChannelId Alphanumeric7{"keyboard_key_alphanumeric_7"}; //!< The 7 key
+ static constexpr inline InputChannelId Alphanumeric8{"keyboard_key_alphanumeric_8"}; //!< The 8 key
+ static constexpr inline InputChannelId Alphanumeric9{"keyboard_key_alphanumeric_9"}; //!< The 9 key
+ static constexpr inline InputChannelId AlphanumericA{"keyboard_key_alphanumeric_A"}; //!< The A key
+ static constexpr inline InputChannelId AlphanumericB{"keyboard_key_alphanumeric_B"}; //!< The B key
+ static constexpr inline InputChannelId AlphanumericC{"keyboard_key_alphanumeric_C"}; //!< The C key
+ static constexpr inline InputChannelId AlphanumericD{"keyboard_key_alphanumeric_D"}; //!< The D key
+ static constexpr inline InputChannelId AlphanumericE{"keyboard_key_alphanumeric_E"}; //!< The E key
+ static constexpr inline InputChannelId AlphanumericF{"keyboard_key_alphanumeric_F"}; //!< The F key
+ static constexpr inline InputChannelId AlphanumericG{"keyboard_key_alphanumeric_G"}; //!< The G key
+ static constexpr inline InputChannelId AlphanumericH{"keyboard_key_alphanumeric_H"}; //!< The H key
+ static constexpr inline InputChannelId AlphanumericI{"keyboard_key_alphanumeric_I"}; //!< The I key
+ static constexpr inline InputChannelId AlphanumericJ{"keyboard_key_alphanumeric_J"}; //!< The J key
+ static constexpr inline InputChannelId AlphanumericK{"keyboard_key_alphanumeric_K"}; //!< The K key
+ static constexpr inline InputChannelId AlphanumericL{"keyboard_key_alphanumeric_L"}; //!< The L key
+ static constexpr inline InputChannelId AlphanumericM{"keyboard_key_alphanumeric_M"}; //!< The M key
+ static constexpr inline InputChannelId AlphanumericN{"keyboard_key_alphanumeric_N"}; //!< The N key
+ static constexpr inline InputChannelId AlphanumericO{"keyboard_key_alphanumeric_O"}; //!< The O key
+ static constexpr inline InputChannelId AlphanumericP{"keyboard_key_alphanumeric_P"}; //!< The P key
+ static constexpr inline InputChannelId AlphanumericQ{"keyboard_key_alphanumeric_Q"}; //!< The Q key
+ static constexpr inline InputChannelId AlphanumericR{"keyboard_key_alphanumeric_R"}; //!< The R key
+ static constexpr inline InputChannelId AlphanumericS{"keyboard_key_alphanumeric_S"}; //!< The S key
+ static constexpr inline InputChannelId AlphanumericT{"keyboard_key_alphanumeric_T"}; //!< The T key
+ static constexpr inline InputChannelId AlphanumericU{"keyboard_key_alphanumeric_U"}; //!< The U key
+ static constexpr inline InputChannelId AlphanumericV{"keyboard_key_alphanumeric_V"}; //!< The V key
+ static constexpr inline InputChannelId AlphanumericW{"keyboard_key_alphanumeric_W"}; //!< The W key
+ static constexpr inline InputChannelId AlphanumericX{"keyboard_key_alphanumeric_X"}; //!< The X key
+ static constexpr inline InputChannelId AlphanumericY{"keyboard_key_alphanumeric_Y"}; //!< The Y key
+ static constexpr inline InputChannelId AlphanumericZ{"keyboard_key_alphanumeric_Z"}; //!< The Z key
- // Edit (and escape) Keys
- static const InputChannelId EditBackspace; //!< The backspace key
- static const InputChannelId EditCapsLock; //!< The caps lock key
- static const InputChannelId EditEnter; //!< The enter/return key
- static const InputChannelId EditSpace; //!< The spacebar key
- static const InputChannelId EditTab; //!< The tab key
- static const InputChannelId Escape; //!< The escape key
+ // Edit {and escape} Keys
+ static constexpr inline InputChannelId EditBackspace{"keyboard_key_edit_backspace"}; //!< The backspace key
+ static constexpr inline InputChannelId EditCapsLock{"keyboard_key_edit_capslock"}; //!< The caps lock key
+ static constexpr inline InputChannelId EditEnter{"keyboard_key_edit_enter"}; //!< The enter/return key
+ static constexpr inline InputChannelId EditSpace{"keyboard_key_edit_space"}; //!< The spacebar key
+ static constexpr inline InputChannelId EditTab{"keyboard_key_edit_tab"}; //!< The tab key
+ static constexpr inline InputChannelId Escape{"keyboard_key_escape"}; //!< The escape key
// Function Keys
- static const InputChannelId Function01; //!< The F1 key
- static const InputChannelId Function02; //!< The F2 key
- static const InputChannelId Function03; //!< The F3 key
- static const InputChannelId Function04; //!< The F4 key
- static const InputChannelId Function05; //!< The F5 key
- static const InputChannelId Function06; //!< The F6 key
- static const InputChannelId Function07; //!< The F7 key
- static const InputChannelId Function08; //!< The F8 key
- static const InputChannelId Function09; //!< The F9 key
- static const InputChannelId Function10; //!< The F10 key
- static const InputChannelId Function11; //!< The F11 key
- static const InputChannelId Function12; //!< The F12 key
- static const InputChannelId Function13; //!< The F13 key
- static const InputChannelId Function14; //!< The F14 key
- static const InputChannelId Function15; //!< The F15 key
- static const InputChannelId Function16; //!< The F16 key
- static const InputChannelId Function17; //!< The F17 key
- static const InputChannelId Function18; //!< The F18 key
- static const InputChannelId Function19; //!< The F19 key
- static const InputChannelId Function20; //!< The F20 key
+ static constexpr inline InputChannelId Function01{"keyboard_key_function_F01"}; //!< The F1 key
+ static constexpr inline InputChannelId Function02{"keyboard_key_function_F02"}; //!< The F2 key
+ static constexpr inline InputChannelId Function03{"keyboard_key_function_F03"}; //!< The F3 key
+ static constexpr inline InputChannelId Function04{"keyboard_key_function_F04"}; //!< The F4 key
+ static constexpr inline InputChannelId Function05{"keyboard_key_function_F05"}; //!< The F5 key
+ static constexpr inline InputChannelId Function06{"keyboard_key_function_F06"}; //!< The F6 key
+ static constexpr inline InputChannelId Function07{"keyboard_key_function_F07"}; //!< The F7 key
+ static constexpr inline InputChannelId Function08{"keyboard_key_function_F08"}; //!< The F8 key
+ static constexpr inline InputChannelId Function09{"keyboard_key_function_F09"}; //!< The F9 key
+ static constexpr inline InputChannelId Function10{"keyboard_key_function_F10"}; //!< The F10 key
+ static constexpr inline InputChannelId Function11{"keyboard_key_function_F11"}; //!< The F11 key
+ static constexpr inline InputChannelId Function12{"keyboard_key_function_F12"}; //!< The F12 key
+ static constexpr inline InputChannelId Function13{"keyboard_key_function_F13"}; //!< The F13 key
+ static constexpr inline InputChannelId Function14{"keyboard_key_function_F14"}; //!< The F14 key
+ static constexpr inline InputChannelId Function15{"keyboard_key_function_F15"}; //!< The F15 key
+ static constexpr inline InputChannelId Function16{"keyboard_key_function_F16"}; //!< The F16 key
+ static constexpr inline InputChannelId Function17{"keyboard_key_function_F17"}; //!< The F17 key
+ static constexpr inline InputChannelId Function18{"keyboard_key_function_F18"}; //!< The F18 key
+ static constexpr inline InputChannelId Function19{"keyboard_key_function_F19"}; //!< The F19 key
+ static constexpr inline InputChannelId Function20{"keyboard_key_function_F20"}; //!< The F20 key
// Modifier Keys
- static const InputChannelId ModifierAltL; //!< The left alt/option key
- static const InputChannelId ModifierAltR; //!< The right alt/option key
- static const InputChannelId ModifierCtrlL; //!< The left control key
- static const InputChannelId ModifierCtrlR; //!< The right control key
- static const InputChannelId ModifierShiftL; //!< The left shift key
- static const InputChannelId ModifierShiftR; //!< The right shift key
- static const InputChannelId ModifierSuperL; //!< The left super (windows or apple) key
- static const InputChannelId ModifierSuperR; //!< The right super (windows or apple) key
+ static constexpr inline InputChannelId ModifierAltL{"keyboard_key_modifier_alt_l"}; //!< The left alt/option key
+ static constexpr inline InputChannelId ModifierAltR{"keyboard_key_modifier_alt_r"}; //!< The right alt/option key
+ static constexpr inline InputChannelId ModifierCtrlL{"keyboard_key_modifier_ctrl_l"}; //!< The left control key
+ static constexpr inline InputChannelId ModifierCtrlR{"keyboard_key_modifier_ctrl_r"}; //!< The right control key
+ static constexpr inline InputChannelId ModifierShiftL{"keyboard_key_modifier_shift_l"}; //!< The left shift key
+ static constexpr inline InputChannelId ModifierShiftR{"keyboard_key_modifier_shift_r"}; //!< The right shift key
+ static constexpr inline InputChannelId ModifierSuperL{"keyboard_key_modifier_super_l"}; //!< The left super {windows or apple} key
+ static constexpr inline InputChannelId ModifierSuperR{"keyboard_key_modifier_super_r"}; //!< The right super {windows or apple} key
// Navigation Keys
- static const InputChannelId NavigationArrowDown; //!< The down arrow key
- static const InputChannelId NavigationArrowLeft; //!< The left arrow key
- static const InputChannelId NavigationArrowRight; //!< The right arrow key
- static const InputChannelId NavigationArrowUp; //!< The up arrow key
- static const InputChannelId NavigationDelete; //!< The delete key
- static const InputChannelId NavigationEnd; //!< The end key
- static const InputChannelId NavigationHome; //!< The home key
- static const InputChannelId NavigationInsert; //!< The insert key
- static const InputChannelId NavigationPageDown; //!< The page down key
- static const InputChannelId NavigationPageUp; //!< The page up key
+ static constexpr inline InputChannelId NavigationArrowDown{"keyboard_key_navigation_arrow_down"}; //!< The down arrow key
+ static constexpr inline InputChannelId NavigationArrowLeft{"keyboard_key_navigation_arrow_left"}; //!< The left arrow key
+ static constexpr inline InputChannelId NavigationArrowRight{"keyboard_key_navigation_arrow_right"}; //!< The right arrow key
+ static constexpr inline InputChannelId NavigationArrowUp{"keyboard_key_navigation_arrow_up"}; //!< The up arrow key
+ static constexpr inline InputChannelId NavigationDelete{"keyboard_key_navigation_delete"}; //!< The delete key
+ static constexpr inline InputChannelId NavigationEnd{"keyboard_key_navigation_end"}; //!< The end key
+ static constexpr inline InputChannelId NavigationHome{"keyboard_key_navigation_home"}; //!< The home key
+ static constexpr inline InputChannelId NavigationInsert{"keyboard_key_navigation_insert"}; //!< The insert key
+ static constexpr inline InputChannelId NavigationPageDown{"keyboard_key_navigation_page_down"}; //!< The page down key
+ static constexpr inline InputChannelId NavigationPageUp{"keyboard_key_navigation_page_up"}; //!< The page up key
// Numpad Keys
- static const InputChannelId NumLock; //!< The num lock key (the clear key on apple keyboards)
- static const InputChannelId NumPad0; //!< The numpad 0 key
- static const InputChannelId NumPad1; //!< The numpad 1 key
- static const InputChannelId NumPad2; //!< The numpad 2 key
- static const InputChannelId NumPad3; //!< The numpad 3 key
- static const InputChannelId NumPad4; //!< The numpad 4 key
- static const InputChannelId NumPad5; //!< The numpad 5 key
- static const InputChannelId NumPad6; //!< The numpad 6 key
- static const InputChannelId NumPad7; //!< The numpad 7 key
- static const InputChannelId NumPad8; //!< The numpad 8 key
- static const InputChannelId NumPad9; //!< The numpad 9 key
- static const InputChannelId NumPadAdd; //!< The numpad add key
- static const InputChannelId NumPadDecimal; //!< The numpad decimal key
- static const InputChannelId NumPadDivide; //!< The numpad divide key
- static const InputChannelId NumPadEnter; //!< The numpad enter key
- static const InputChannelId NumPadMultiply; //!< The numpad multiply key
- static const InputChannelId NumPadSubtract; //!< The numpad subtract key
+ static constexpr inline InputChannelId NumLock{"keyboard_key_num_lock"}; //!< The num lock key {the clear key on apple keyboards}
+ static constexpr inline InputChannelId NumPad0{"keyboard_key_numpad_0"}; //!< The numpad 0 key
+ static constexpr inline InputChannelId NumPad1{"keyboard_key_numpad_1"}; //!< The numpad 1 key
+ static constexpr inline InputChannelId NumPad2{"keyboard_key_numpad_2"}; //!< The numpad 2 key
+ static constexpr inline InputChannelId NumPad3{"keyboard_key_numpad_3"}; //!< The numpad 3 key
+ static constexpr inline InputChannelId NumPad4{"keyboard_key_numpad_4"}; //!< The numpad 4 key
+ static constexpr inline InputChannelId NumPad5{"keyboard_key_numpad_5"}; //!< The numpad 5 key
+ static constexpr inline InputChannelId NumPad6{"keyboard_key_numpad_6"}; //!< The numpad 6 key
+ static constexpr inline InputChannelId NumPad7{"keyboard_key_numpad_7"}; //!< The numpad 7 key
+ static constexpr inline InputChannelId NumPad8{"keyboard_key_numpad_8"}; //!< The numpad 8 key
+ static constexpr inline InputChannelId NumPad9{"keyboard_key_numpad_9"}; //!< The numpad 9 key
+ static constexpr inline InputChannelId NumPadAdd{"keyboard_key_numpad_add"}; //!< The numpad add key
+ static constexpr inline InputChannelId NumPadDecimal{"keyboard_key_numpad_decimal"}; //!< The numpad decimal key
+ static constexpr inline InputChannelId NumPadDivide{"keyboard_key_numpad_divide"}; //!< The numpad divide key
+ static constexpr inline InputChannelId NumPadEnter{"keyboard_key_numpad_enter"}; //!< The numpad enter key
+ static constexpr inline InputChannelId NumPadMultiply{"keyboard_key_numpad_multiply"}; //!< The numpad multiply key
+ static constexpr inline InputChannelId NumPadSubtract{"keyboard_key_numpad_subtract"}; //!< The numpad subtract key
// Punctuation Keys
- static const InputChannelId PunctuationApostrophe; //!< The apostrophe key
- static const InputChannelId PunctuationBackslash; //!< The backslash key
- static const InputChannelId PunctuationBracketL; //!< The left bracket key
- static const InputChannelId PunctuationBracketR; //!< The right bracket key
- static const InputChannelId PunctuationComma; //!< The comma key
- static const InputChannelId PunctuationEquals; //!< The equals key
- static const InputChannelId PunctuationHyphen; //!< The hyphen/underscore key
- static const InputChannelId PunctuationPeriod; //!< The period key
- static const InputChannelId PunctuationSemicolon; //!< The semicolon key
- static const InputChannelId PunctuationSlash; //!< The (forward) slash key
- static const InputChannelId PunctuationTilde; //!< The tilde/grave key
+ static constexpr inline InputChannelId PunctuationApostrophe{"keyboard_key_punctuation_apostrophe"}; //!< The apostrophe key
+ static constexpr inline InputChannelId PunctuationBackslash{"keyboard_key_punctuation_backslash"}; //!< The backslash key
+ static constexpr inline InputChannelId PunctuationBracketL{"keyboard_key_punctuation_bracket_l"}; //!< The left bracket key
+ static constexpr inline InputChannelId PunctuationBracketR{"keyboard_key_punctuation_bracket_r"}; //!< The right bracket key
+ static constexpr inline InputChannelId PunctuationComma{"keyboard_key_punctuation_comma"}; //!< The comma key
+ static constexpr inline InputChannelId PunctuationEquals{"keyboard_key_punctuation_equals"}; //!< The equals key
+ static constexpr inline InputChannelId PunctuationHyphen{"keyboard_key_punctuation_hyphen"}; //!< The hyphen/underscore key
+ static constexpr inline InputChannelId PunctuationPeriod{"keyboard_key_punctuation_period"}; //!< The period key
+ static constexpr inline InputChannelId PunctuationSemicolon{"keyboard_key_punctuation_semicolon"}; //!< The semicolon key
+ static constexpr inline InputChannelId PunctuationSlash{"keyboard_key_punctuation_slash"}; //!< The {forward} slash key
+ static constexpr inline InputChannelId PunctuationTilde{"keyboard_key_punctuation_tilde"}; //!< The tilde/grave key
// Supplementary ISO Key
- static const InputChannelId SupplementaryISO; //!< The supplementary ISO layout key
+ static constexpr inline InputChannelId SupplementaryISO{"keyboard_key_supplementary_iso"}; //!< The supplementary ISO layout key
// Windows System Keys
- static const InputChannelId WindowsSystemPause; //!< The windows pause key
- static const InputChannelId WindowsSystemPrint; //!< The windows print key
- static const InputChannelId WindowsSystemScrollLock; //!< The windows scroll lock key
+ static constexpr inline InputChannelId WindowsSystemPause{"keyboard_key_windows_system_pause"}; //!< The windows pause key
+ static constexpr inline InputChannelId WindowsSystemPrint{"keyboard_key_windows_system_print"}; //!< The windows print key
+ static constexpr inline InputChannelId WindowsSystemScrollLock{"keyboard_key_windows_system_scroll_lock"}; //!< The windows scroll lock key
//!< All keyboard key ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ // Alphanumeric Keys
+ Alphanumeric0,
+ Alphanumeric1,
+ Alphanumeric2,
+ Alphanumeric3,
+ Alphanumeric4,
+ Alphanumeric5,
+ Alphanumeric6,
+ Alphanumeric7,
+ Alphanumeric8,
+ Alphanumeric9,
+ AlphanumericA,
+ AlphanumericB,
+ AlphanumericC,
+ AlphanumericD,
+ AlphanumericE,
+ AlphanumericF,
+ AlphanumericG,
+ AlphanumericH,
+ AlphanumericI,
+ AlphanumericJ,
+ AlphanumericK,
+ AlphanumericL,
+ AlphanumericM,
+ AlphanumericN,
+ AlphanumericO,
+ AlphanumericP,
+ AlphanumericQ,
+ AlphanumericR,
+ AlphanumericS,
+ AlphanumericT,
+ AlphanumericU,
+ AlphanumericV,
+ AlphanumericW,
+ AlphanumericX,
+ AlphanumericY,
+ AlphanumericZ,
+
+ // Edit (and escape) Keys
+ EditBackspace,
+ EditCapsLock,
+ EditEnter,
+ EditSpace,
+ EditTab,
+ Escape,
+
+ // Function Keys
+ Function01,
+ Function02,
+ Function03,
+ Function04,
+ Function05,
+ Function06,
+ Function07,
+ Function08,
+ Function09,
+ Function10,
+ Function11,
+ Function12,
+ Function13,
+ Function14,
+ Function15,
+ Function16,
+ Function17,
+ Function18,
+ Function19,
+ Function20,
+
+ // Modifier Keys
+ ModifierAltL,
+ ModifierAltR,
+ ModifierCtrlL,
+ ModifierCtrlR,
+ ModifierShiftL,
+ ModifierShiftR,
+ ModifierSuperL,
+ ModifierSuperR,
+
+ // Navigation Keys
+ NavigationArrowDown,
+ NavigationArrowLeft,
+ NavigationArrowRight,
+ NavigationArrowUp,
+ NavigationDelete,
+ NavigationEnd,
+ NavigationHome,
+ NavigationInsert,
+ NavigationPageDown,
+ NavigationPageUp,
+
+ // Numpad Keys
+ NumLock,
+ NumPad0,
+ NumPad1,
+ NumPad2,
+ NumPad3,
+ NumPad4,
+ NumPad5,
+ NumPad6,
+ NumPad7,
+ NumPad8,
+ NumPad9,
+ NumPadAdd,
+ NumPadDecimal,
+ NumPadDivide,
+ NumPadEnter,
+ NumPadMultiply,
+ NumPadSubtract,
+
+ // Punctuation Keys
+ PunctuationApostrophe,
+ PunctuationBackslash,
+ PunctuationBracketL,
+ PunctuationBracketR,
+ PunctuationComma,
+ PunctuationEquals,
+ PunctuationHyphen,
+ PunctuationPeriod,
+ PunctuationSemicolon,
+ PunctuationSlash,
+ PunctuationTilde,
+
+ // Supplementary ISO Key
+ SupplementaryISO,
+
+ // Windows System Keys
+ WindowsSystemPause,
+ WindowsSystemPrint,
+ WindowsSystemScrollLock
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.cpp
index 34c72f20d2..c144f63d2c 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.cpp
@@ -23,44 +23,6 @@ namespace AzFramework
return (inputDeviceId.GetNameCrc32() == Id.GetNameCrc32());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMotion::Acceleration::Gravity("motion_acceleration_gravity");
- const InputChannelId InputDeviceMotion::Acceleration::Raw("motion_acceleration_raw");
- const InputChannelId InputDeviceMotion::Acceleration::User("motion_acceleration_user");
- const AZStd::array InputDeviceMotion::Acceleration::All =
- {{
- Gravity,
- Raw,
- User
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMotion::RotationRate::Raw("motion_rotation_rate_raw");
- const InputChannelId InputDeviceMotion::RotationRate::Unbiased("motion_rotation_rate_unbiased");
- const AZStd::array InputDeviceMotion::RotationRate::All =
- {{
- Raw,
- Unbiased
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMotion::MagneticField::North("motion_magnetic_field_north");
- const InputChannelId InputDeviceMotion::MagneticField::Raw("motion_magnetic_field_raw");
- const InputChannelId InputDeviceMotion::MagneticField::Unbiased("motion_magnetic_field_unbiased");
- const AZStd::array InputDeviceMotion::MagneticField::All =
- {{
- North,
- Raw,
- Unbiased
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMotion::Orientation::Current("motion_orientation_current");
- const AZStd::array InputDeviceMotion::Orientation::All =
- {{
- Current
- }};
-
////////////////////////////////////////////////////////////////////////////////////////////////
void InputDeviceMotion::Reflect(AZ::ReflectContext* context)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.h b/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.h
index 1e020a6e02..872bd1cfa0 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Motion/InputDeviceMotion.h
@@ -44,12 +44,17 @@ namespace AzFramework
//! - InputMotionSensorRequests::SetInputChannelEnabled
struct Acceleration
{
- static const InputChannelId Gravity;
- static const InputChannelId Raw;
- static const InputChannelId User;
+ static constexpr inline InputChannelId Gravity{"motion_acceleration_gravity"};
+ static constexpr inline InputChannelId Raw{"motion_acceleration_raw"};
+ static constexpr inline InputChannelId User{"motion_acceleration_user"};
//!< All acceleration input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ Gravity,
+ Raw,
+ User
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
@@ -60,11 +65,15 @@ namespace AzFramework
//! - InputMotionSensorRequests::SetInputChannelEnabled
struct RotationRate
{
- static const InputChannelId Raw;
- static const InputChannelId Unbiased;
+ static constexpr inline InputChannelId Raw{"motion_rotation_rate_raw"};
+ static constexpr inline InputChannelId Unbiased{"motion_rotation_rate_unbiased"};
//!< All rotation rate input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ Raw,
+ Unbiased
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
@@ -75,12 +84,17 @@ namespace AzFramework
//! - InputMotionSensorRequests::SetInputChannelEnabled
struct MagneticField
{
- static const InputChannelId North;
- static const InputChannelId Raw;
- static const InputChannelId Unbiased;
+ static constexpr inline InputChannelId North{"motion_magnetic_field_north"};
+ static constexpr inline InputChannelId Raw{"motion_magnetic_field_raw"};
+ static constexpr inline InputChannelId Unbiased{"motion_magnetic_field_unbiased"};
//!< All magnetic field input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ North,
+ Raw,
+ Unbiased
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
@@ -91,10 +105,13 @@ namespace AzFramework
//! - InputMotionSensorRequests::SetInputChannelEnabled
struct Orientation
{
- static const InputChannelId Current;
+ static constexpr inline InputChannelId Current{"motion_orientation_current"};
//!< All orientation input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ Current
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.cpp
index 2cc4573bce..e9af4cc4ce 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.cpp
@@ -33,35 +33,6 @@ namespace AzFramework
return (inputDeviceId.GetNameCrc32() == Id.GetNameCrc32());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMouse::Button::Left("mouse_button_left");
- const InputChannelId InputDeviceMouse::Button::Right("mouse_button_right");
- const InputChannelId InputDeviceMouse::Button::Middle("mouse_button_middle");
- const InputChannelId InputDeviceMouse::Button::Other1("mouse_button_other1");
- const InputChannelId InputDeviceMouse::Button::Other2("mouse_button_other2");
- const AZStd::array InputDeviceMouse::Button::All =
- {{
- Left,
- Right,
- Middle,
- Other1,
- Other2
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMouse::Movement::X("mouse_delta_x");
- const InputChannelId InputDeviceMouse::Movement::Y("mouse_delta_y");
- const InputChannelId InputDeviceMouse::Movement::Z("mouse_delta_z");
- const AZStd::array InputDeviceMouse::Movement::All =
- {{
- X,
- Y,
- Z
- }};
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceMouse::SystemCursorPosition("mouse_system_cursor_position");
-
////////////////////////////////////////////////////////////////////////////////////////////////
void InputDeviceMouse::Reflect(AZ::ReflectContext* context)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.h b/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.h
index 99fe5b820c..3b35e03f1b 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Mouse/InputDeviceMouse.h
@@ -66,14 +66,21 @@ namespace AzFramework
//! been implemented for windows simply to provide for backwards compatibility with CryInput.
struct Button
{
- static const InputChannelId Left; //!< The left mouse button
- static const InputChannelId Right; //!< The right mouse button
- static const InputChannelId Middle; //!< The middle mouse button
- static const InputChannelId Other1; //!< DEPRECATED: the x1 mouse button
- static const InputChannelId Other2; //!< DEPRECATED: the x2 mouse button
+ static constexpr inline InputChannelId Left{"mouse_button_left"}; //!< The left mouse button
+ static constexpr inline InputChannelId Right{"mouse_button_right"}; //!< The right mouse button
+ static constexpr inline InputChannelId Middle{"mouse_button_middle"}; //!< The middle mouse button
+ static constexpr inline InputChannelId Other1{"mouse_button_other1"}; //!< DEPRECATED: the x1 mouse button
+ static constexpr inline InputChannelId Other2{"mouse_button_other2"}; //!< DEPRECATED: the x2 mouse button
//!< All mouse button ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ Left,
+ Right,
+ Middle,
+ Other1,
+ Other2
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
@@ -82,12 +89,17 @@ namespace AzFramework
//! directly correlate to the mouse position (which is queried directly from the system).
struct Movement
{
- static const InputChannelId X; //!< Raw horizontal mouse movement over the last frame
- static const InputChannelId Y; //!< Raw vertical mouse movement over the last frame
- static const InputChannelId Z; //!< Raw mouse wheel movement over the last frame
+ static constexpr inline InputChannelId X{"mouse_delta_x"}; //!< Raw horizontal mouse movement over the last frame
+ static constexpr inline InputChannelId Y{"mouse_delta_y"}; //!< Raw vertical mouse movement over the last frame
+ static constexpr inline InputChannelId Z{"mouse_delta_z"}; //!< Raw mouse wheel movement over the last frame
//!< All mouse movement ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ X,
+ Y,
+ Z
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
@@ -96,7 +108,7 @@ namespace AzFramework
//! the system cursor is hidden or visible. When the system cursor has been constrained to
//! the active window values will be in the [0.0, 1.0] range, but not when unconstrained.
//! See also InputSystemCursorRequests::SetSystemCursorState and GetSystemCursorState.
- static const InputChannelId SystemCursorPosition;
+ static constexpr inline InputChannelId SystemCursorPosition{"mouse_system_cursor_position"};
////////////////////////////////////////////////////////////////////////////////////////////
// Allocator
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.cpp
index 07d10090a3..be850e9289 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.cpp
@@ -24,31 +24,6 @@ namespace AzFramework
return (inputDeviceId.GetNameCrc32() == Id.GetNameCrc32());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceTouch::Touch::Index0("touch_index_0");
- const InputChannelId InputDeviceTouch::Touch::Index1("touch_index_1");
- const InputChannelId InputDeviceTouch::Touch::Index2("touch_index_2");
- const InputChannelId InputDeviceTouch::Touch::Index3("touch_index_3");
- const InputChannelId InputDeviceTouch::Touch::Index4("touch_index_4");
- const InputChannelId InputDeviceTouch::Touch::Index5("touch_index_5");
- const InputChannelId InputDeviceTouch::Touch::Index6("touch_index_6");
- const InputChannelId InputDeviceTouch::Touch::Index7("touch_index_7");
- const InputChannelId InputDeviceTouch::Touch::Index8("touch_index_8");
- const InputChannelId InputDeviceTouch::Touch::Index9("touch_index_9");
- const AZStd::array InputDeviceTouch::Touch::All =
- {{
- Index0,
- Index1,
- Index2,
- Index3,
- Index4,
- Index5,
- Index6,
- Index7,
- Index8,
- Index9
- }};
-
////////////////////////////////////////////////////////////////////////////////////////////////
void InputDeviceTouch::Reflect(AZ::ReflectContext* context)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.h b/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.h
index 6e069c44ba..d21834c22a 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/Touch/InputDeviceTouch.h
@@ -38,19 +38,31 @@ namespace AzFramework
//! track is arbitrary, but ten seems to be more than sufficient for most game applications.
struct Touch
{
- static const InputChannelId Index0; //!< Touch index 0
- static const InputChannelId Index1; //!< Touch index 1
- static const InputChannelId Index2; //!< Touch index 2
- static const InputChannelId Index3; //!< Touch index 3
- static const InputChannelId Index4; //!< Touch index 4
- static const InputChannelId Index5; //!< Touch index 5
- static const InputChannelId Index6; //!< Touch index 6
- static const InputChannelId Index7; //!< Touch index 7
- static const InputChannelId Index8; //!< Touch index 8
- static const InputChannelId Index9; //!< Touch index 9
+ static constexpr inline InputChannelId Index0{"touch_index_0"}; //!< Touch index 0
+ static constexpr inline InputChannelId Index1{"touch_index_1"}; //!< Touch index 1
+ static constexpr inline InputChannelId Index2{"touch_index_2"}; //!< Touch index 2
+ static constexpr inline InputChannelId Index3{"touch_index_3"}; //!< Touch index 3
+ static constexpr inline InputChannelId Index4{"touch_index_4"}; //!< Touch index 4
+ static constexpr inline InputChannelId Index5{"touch_index_5"}; //!< Touch index 5
+ static constexpr inline InputChannelId Index6{"touch_index_6"}; //!< Touch index 6
+ static constexpr inline InputChannelId Index7{"touch_index_7"}; //!< Touch index 7
+ static constexpr inline InputChannelId Index8{"touch_index_8"}; //!< Touch index 8
+ static constexpr inline InputChannelId Index9{"touch_index_9"}; //!< Touch index 9
//!< All touch input channel ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ Index0,
+ Index1,
+ Index2,
+ Index3,
+ Index4,
+ Index5,
+ Index6,
+ Index7,
+ Index8,
+ Index9
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.cpp
index bc23826ebc..f3024f11ab 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.cpp
@@ -23,17 +23,6 @@ namespace AzFramework
return (inputDeviceId.GetNameCrc32() == Id.GetNameCrc32());
}
- ////////////////////////////////////////////////////////////////////////////////////////////////
- const InputChannelId InputDeviceVirtualKeyboard::Command::EditEnter("virtual_keyboard_edit_enter");
- const InputChannelId InputDeviceVirtualKeyboard::Command::EditClear("virtual_keyboard_edit_clear");
- const InputChannelId InputDeviceVirtualKeyboard::Command::NavigationBack("virtual_keyboard_navigation_back");
- const AZStd::array InputDeviceVirtualKeyboard::Command::All =
- {{
- EditClear,
- EditEnter,
- NavigationBack
- }};
-
////////////////////////////////////////////////////////////////////////////////////////////////
void InputDeviceVirtualKeyboard::Reflect(AZ::ReflectContext* context)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.h b/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.h
index 43e2815875..6f62c3ec61 100644
--- a/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.h
+++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard.h
@@ -39,17 +39,22 @@ namespace AzFramework
struct Command
{
//!< The clear command used to indicate the user wants to clear the active text field
- static const InputChannelId EditClear;
+ static constexpr inline InputChannelId EditClear{"virtual_keyboard_edit_enter"};
//!< The enter/return/close command used to indicate the user has finished text editing
- static const InputChannelId EditEnter;
+ static constexpr inline InputChannelId EditEnter{"virtual_keyboard_edit_clear"};
//!< The back command used to indicate the user wants to navigate 'backwards'.
//!< This is specific to android devices, and does not have an ios equivalent.
- static const InputChannelId NavigationBack;
+ static constexpr inline InputChannelId NavigationBack{"virtual_keyboard_navigation_back"};
//!< All virtual keyboard command ids
- static const AZStd::array All;
+ static constexpr inline AZStd::array All
+ {
+ EditClear,
+ EditEnter,
+ NavigationBack
+ };
};
////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ScreenGeometry.h b/Code/Framework/AzFramework/AzFramework/Viewport/ScreenGeometry.h
index c0fa1ad631..1529d760e5 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/ScreenGeometry.h
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/ScreenGeometry.h
@@ -8,11 +8,10 @@
#pragma once
-#include
-#include
-#include
-#include
#include
+#include
+#include
+#include
namespace AZ
{
@@ -27,7 +26,11 @@ namespace AzFramework
AZ_TYPE_INFO(ScreenPoint, "{8472B6C2-527F-44FC-87F8-C226B1A57A97}");
ScreenPoint() = default;
- ScreenPoint(int x, int y) : m_x(x), m_y(y) {}
+ ScreenPoint(int x, int y)
+ : m_x(x)
+ , m_y(y)
+ {
+ }
int m_x; //!< X screen position.
int m_y; //!< Y screen position.
@@ -42,7 +45,11 @@ namespace AzFramework
AZ_TYPE_INFO(ScreenVector, "{1EAA2C62-8FDB-4A28-9FE3-1FA4F1418894}");
ScreenVector() = default;
- ScreenVector(int x, int y) : m_x(x), m_y(y) {}
+ ScreenVector(int x, int y)
+ : m_x(x)
+ , m_y(y)
+ {
+ }
int m_x; //!< X screen delta.
int m_y; //!< Y screen delta.
@@ -71,14 +78,14 @@ namespace AzFramework
inline const ScreenPoint operator+(const ScreenPoint& lhs, const ScreenVector& rhs)
{
- ScreenPoint result{lhs};
+ ScreenPoint result{ lhs };
result += rhs;
return result;
}
inline const ScreenPoint operator-(const ScreenPoint& lhs, const ScreenVector& rhs)
{
- ScreenPoint result{lhs};
+ ScreenPoint result{ lhs };
result -= rhs;
return result;
}
@@ -99,14 +106,14 @@ namespace AzFramework
inline const ScreenVector operator+(const ScreenVector& lhs, const ScreenVector& rhs)
{
- ScreenVector result{lhs};
+ ScreenVector result{ lhs };
result += rhs;
return result;
}
inline const ScreenVector operator-(const ScreenVector& lhs, const ScreenVector& rhs)
{
- ScreenVector result{lhs};
+ ScreenVector result{ lhs };
result -= rhs;
return result;
}
@@ -131,23 +138,25 @@ namespace AzFramework
return !operator==(lhs, rhs);
}
+ inline ScreenVector& operator*=(ScreenVector& lhs, const float rhs)
+ {
+ lhs.m_x = aznumeric_cast(AZStd::lround(aznumeric_cast(lhs.m_x) * rhs));
+ lhs.m_y = aznumeric_cast(AZStd::lround(aznumeric_cast(lhs.m_y) * rhs));
+ return lhs;
+ }
+
+ inline const ScreenVector operator*(const ScreenVector& lhs, const float rhs)
+ {
+ ScreenVector result{ lhs };
+ result *= rhs;
+ return result;
+ }
+
inline float ScreenVectorLength(const ScreenVector& screenVector)
{
return aznumeric_cast(AZStd::sqrt(screenVector.m_x * screenVector.m_x + screenVector.m_y * screenVector.m_y));
}
- inline ScreenPoint ScreenPointFromNDC(const AZ::Vector3& screenNDC, const AZ::Vector2& viewportSize)
- {
- return ScreenPoint(
- aznumeric_caster(AZStd::round(screenNDC.GetX() * viewportSize.GetX())),
- aznumeric_caster(AZStd::round((1.0f - screenNDC.GetY()) * viewportSize.GetY())));
- }
-
- inline AZ::Vector2 NDCFromScreenPoint(const ScreenPoint& screenPoint, const AZ::Vector2& viewportSize)
- {
- return AZ::Vector2(aznumeric_cast(screenPoint.m_x), viewportSize.GetY() - aznumeric_cast(screenPoint.m_y)) / viewportSize;
- }
-
//! Return an AZ::Vector2 from a ScreenPoint.
inline AZ::Vector2 Vector2FromScreenPoint(const ScreenPoint& screenPoint)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.cpp
index a94b806ad3..afd16a6c23 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.cpp
@@ -23,7 +23,7 @@ namespace AzFramework
// y-up, z into the screen, x-left
//
// x -> -x
- // y -> z
+ // y -> z
// z -> y
//
// the same transform can be used to go to/from z-up - the only difference is the order of
@@ -37,15 +37,15 @@ namespace AzFramework
// yaw = AZ::Matrix4x4::CreateRotationZ(AZ::DegToRad(180.0f));
// conversion = pitch * yaw
return AZ::Matrix4x4::CreateFromColumns(
- AZ::Vector4(-1.0f, 0.0f, 0.0f, 0.0f), AZ::Vector4(0.0f, 0.0f, 1.0f, .0f),
- AZ::Vector4(0.0f, 1.0f, 0.0f, 0.0f), AZ::Vector4(0.0f, 0.0f, 0.0f, 1.0f));
+ AZ::Vector4(-1.0f, 0.0f, 0.0f, 0.0f), AZ::Vector4(0.0f, 0.0f, 1.0f, 0.0f), AZ::Vector4(0.0f, 1.0f, 0.0f, 0.0f),
+ AZ::Vector4(0.0f, 0.0f, 0.0f, 1.0f));
}
AZ::Matrix4x4 CameraTransform(const CameraState& cameraState)
{
return AZ::Matrix4x4::CreateFromColumns(
- AZ::Vector3ToVector4(cameraState.m_side), AZ::Vector3ToVector4(cameraState.m_forward),
- AZ::Vector3ToVector4(cameraState.m_up), AZ::Vector3ToVector4(cameraState.m_position, 1.0f));
+ AZ::Vector3ToVector4(cameraState.m_side), AZ::Vector3ToVector4(cameraState.m_forward), AZ::Vector3ToVector4(cameraState.m_up),
+ AZ::Vector3ToVector4(cameraState.m_position, 1.0f));
}
AZ::Matrix4x4 CameraView(const CameraState& cameraState)
@@ -63,8 +63,7 @@ namespace AzFramework
AZ::Matrix4x4 CameraProjection(const CameraState& cameraState)
{
return AZ::Matrix4x4::CreateProjection(
- cameraState.VerticalFovRadian(), AspectRatio(cameraState.m_viewportSize), cameraState.m_nearClip,
- cameraState.m_farClip);
+ cameraState.VerticalFovRadian(), AspectRatio(cameraState.m_viewportSize), cameraState.m_nearClip, cameraState.m_farClip);
}
AZ::Matrix4x4 InverseCameraProjection(const CameraState& cameraState)
@@ -93,12 +92,11 @@ namespace AzFramework
const auto cameraWorldTransform = AZ::Transform::CreateFromMatrix3x3AndTranslation(
AZ::Matrix3x3::CreateFromMatrix4x4(worldFromView), worldFromView.GetTranslation());
return AZ::ViewFrustumAttributes(
- cameraWorldTransform, AspectRatio(cameraState.m_viewportSize), cameraState.m_fovOrZoom,
- cameraState.m_nearClip, cameraState.m_farClip);
+ cameraWorldTransform, AspectRatio(cameraState.m_viewportSize), cameraState.m_fovOrZoom, cameraState.m_nearClip,
+ cameraState.m_farClip);
}
- AZ::Vector3 WorldToScreenNDC(
- const AZ::Vector3& worldPosition, const AZ::Matrix4x4& cameraView, const AZ::Matrix4x4& cameraProjection)
+ AZ::Vector3 WorldToScreenNdc(const AZ::Vector3& worldPosition, const AZ::Matrix4x4& cameraView, const AZ::Matrix4x4& cameraProjection)
{
// transform the world space position to clip space
const auto clipSpacePosition = cameraProjection * cameraView * AZ::Vector3ToVector4(worldPosition, 1.0f);
@@ -108,25 +106,24 @@ namespace AzFramework
return (AZ::Vector4ToVector3(ndcPosition) + AZ::Vector3::CreateOne()) * 0.5f;
}
-
ScreenPoint WorldToScreen(
- const AZ::Vector3& worldPosition, const AZ::Matrix4x4& cameraView, const AZ::Matrix4x4& cameraProjection,
+ const AZ::Vector3& worldPosition,
+ const AZ::Matrix4x4& cameraView,
+ const AZ::Matrix4x4& cameraProjection,
const AZ::Vector2& viewportSize)
{
- const auto ndcNormalizedPosition = WorldToScreenNDC(worldPosition, cameraView, cameraProjection);
+ const auto ndcNormalizedPosition = WorldToScreenNdc(worldPosition, cameraView, cameraProjection);
// scale ndc position by screen dimensions to return screen position
- return ScreenPointFromNDC(ndcNormalizedPosition, viewportSize);
+ return ScreenPointFromNdc(AZ::Vector3ToVector2(ndcNormalizedPosition), viewportSize);
}
ScreenPoint WorldToScreen(const AZ::Vector3& worldPosition, const CameraState& cameraState)
{
- return WorldToScreen(
- worldPosition, CameraView(cameraState), CameraProjection(cameraState), cameraState.m_viewportSize);
+ return WorldToScreen(worldPosition, CameraView(cameraState), CameraProjection(cameraState), cameraState.m_viewportSize);
}
- AZ::Vector3 ScreenNDCToWorld(
- const AZ::Vector2& normalizedScreenPosition, const AZ::Matrix4x4& inverseCameraView,
- const AZ::Matrix4x4& inverseCameraProjection)
+ AZ::Vector3 ScreenNdcToWorld(
+ const AZ::Vector2& normalizedScreenPosition, const AZ::Matrix4x4& inverseCameraView, const AZ::Matrix4x4& inverseCameraProjection)
{
// convert screen space coordinates from <0, 1> to <-1,1> range
const auto ndcPosition = normalizedScreenPosition * 2.0f - AZ::Vector2::CreateOne();
@@ -142,18 +139,19 @@ namespace AzFramework
}
AZ::Vector3 ScreenToWorld(
- const ScreenPoint& screenPosition, const AZ::Matrix4x4& inverseCameraView,
- const AZ::Matrix4x4& inverseCameraProjection, const AZ::Vector2& viewportSize)
+ const ScreenPoint& screenPosition,
+ const AZ::Matrix4x4& inverseCameraView,
+ const AZ::Matrix4x4& inverseCameraProjection,
+ const AZ::Vector2& viewportSize)
{
- const auto normalizedScreenPosition = NDCFromScreenPoint(screenPosition, viewportSize);
+ const auto normalizedScreenPosition = NdcFromScreenPoint(screenPosition, viewportSize);
- return ScreenNDCToWorld(normalizedScreenPosition, inverseCameraView, inverseCameraProjection);
+ return ScreenNdcToWorld(normalizedScreenPosition, inverseCameraView, inverseCameraProjection);
}
AZ::Vector3 ScreenToWorld(const ScreenPoint& screenPosition, const CameraState& cameraState)
{
return ScreenToWorld(
- screenPosition, InverseCameraView(cameraState), InverseCameraProjection(cameraState),
- cameraState.m_viewportSize);
+ screenPosition, InverseCameraView(cameraState), InverseCameraProjection(cameraState), cameraState.m_viewportSize);
}
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.h b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.h
index 87bad66eab..8a6c0249b2 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.h
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportScreen.h
@@ -8,26 +8,42 @@
#pragma once
+#include
#include
+#include
+#include
namespace AZ
{
class Frustum;
class Matrix4x4;
- class Vector3;
struct ViewFrustumAttributes;
} // namespace AZ
namespace AzFramework
{
struct CameraState;
- struct ScreenPoint;
struct ViewportInfo;
- //! Projects a position in world space to screen space normalized device coordinates for the given camera.
- AZ::Vector3 WorldToScreenNDC(
- const AZ::Vector3& worldPosition, const AZ::Matrix4x4& cameraView, const AZ::Matrix4x4& cameraProjection);
+ //! Returns a position in screen space (in the range [0-viewportSize.x, 0-viewportSize.y]) from normalized device
+ //! coordinates (in the range 0.0-1.0).
+ inline ScreenPoint ScreenPointFromNdc(const AZ::Vector2& screenNdc, const AZ::Vector2& viewportSize)
+ {
+ return ScreenPoint(
+ aznumeric_cast(AZStd::lround(screenNdc.GetX() * viewportSize.GetX())),
+ aznumeric_cast(AZStd::lround((1.0f - screenNdc.GetY()) * viewportSize.GetY())));
+ }
+ //! Returns a position in normalized device coordinates (in the range [0.0-1.0, 0.0-1.0]) from a
+ //! screen space position (in the range [0-viewportSize.x, 0-viewportSize.y]).
+ inline AZ::Vector2 NdcFromScreenPoint(const ScreenPoint& screenPoint, const AZ::Vector2& viewportSize)
+ {
+ return AZ::Vector2(aznumeric_cast(screenPoint.m_x), viewportSize.GetY() - aznumeric_cast(screenPoint.m_y)) /
+ viewportSize;
+ }
+
+ //! Projects a position in world space to screen space normalized device coordinates for the given camera.
+ AZ::Vector3 WorldToScreenNdc(const AZ::Vector3& worldPosition, const AZ::Matrix4x4& cameraView, const AZ::Matrix4x4& cameraProjection);
//! Projects a position in world space to screen space for the given camera.
ScreenPoint WorldToScreen(const AZ::Vector3& worldPosition, const CameraState& cameraState);
@@ -35,7 +51,9 @@ namespace AzFramework
//! Overload of WorldToScreen that accepts camera values that can be precomputed if this function
//! is called many times in a loop.
ScreenPoint WorldToScreen(
- const AZ::Vector3& worldPosition, const AZ::Matrix4x4& cameraView, const AZ::Matrix4x4& cameraProjection,
+ const AZ::Vector3& worldPosition,
+ const AZ::Matrix4x4& cameraView,
+ const AZ::Matrix4x4& cameraProjection,
const AZ::Vector2& viewportSize);
//! Unprojects a position in screen space pixel coordinates to world space.
@@ -45,14 +63,15 @@ namespace AzFramework
//! Overload of ScreenToWorld that accepts camera values that can be precomputed if this function
//! is called many times in a loop.
AZ::Vector3 ScreenToWorld(
- const ScreenPoint& screenPosition, const AZ::Matrix4x4& inverseCameraView,
- const AZ::Matrix4x4& inverseCameraProjection, const AZ::Vector2& viewportSize);
+ const ScreenPoint& screenPosition,
+ const AZ::Matrix4x4& inverseCameraView,
+ const AZ::Matrix4x4& inverseCameraProjection,
+ const AZ::Vector2& viewportSize);
//! Unprojects a position in screen space normalized device coordinates to world space.
//! Note: The position returned will be on the near clip plane of the camera in world space.
- AZ::Vector3 ScreenNDCToWorld(
- const AZ::Vector2& ndcPosition, const AZ::Matrix4x4& inverseCameraView,
- const AZ::Matrix4x4& inverseCameraProjection);
+ AZ::Vector3 ScreenNdcToWorld(
+ const AZ::Vector2& ndcPosition, const AZ::Matrix4x4& inverseCameraView, const AZ::Matrix4x4& inverseCameraProjection);
//! Returns the camera projection for the current camera state.
AZ::Matrix4x4 CameraProjection(const CameraState& cameraState);
diff --git a/Code/Framework/AzFramework/CMakeLists.txt b/Code/Framework/AzFramework/CMakeLists.txt
index 6f6e47855e..f6851f0ab8 100644
--- a/Code/Framework/AzFramework/CMakeLists.txt
+++ b/Code/Framework/AzFramework/CMakeLists.txt
@@ -95,4 +95,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
endif()
-endif()
\ No newline at end of file
+endif()
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbApplication.cpp
similarity index 54%
rename from Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp
rename to Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbApplication.cpp
index aaab67b2a1..7cbd9ae0e2 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbApplication.cpp
@@ -6,29 +6,26 @@
*
*/
-#include
-#include
-#include "Application_Linux_xcb.h"
+#include
+#include
-////////////////////////////////////////////////////////////////////////////////////////////////////
namespace AzFramework
{
-#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
////////////////////////////////////////////////////////////////////////////////////////////////
- class LinuxXcbConnectionManagerImpl
- : public LinuxXcbConnectionManagerBus::Handler
+ class XcbConnectionManagerImpl
+ : public XcbConnectionManagerBus::Handler
{
public:
- LinuxXcbConnectionManagerImpl()
+ XcbConnectionManagerImpl()
{
m_xcbConnection = xcb_connect(nullptr, nullptr);
- AZ_Error("ApplicationLinux", m_xcbConnection != nullptr, "Unable to connect to X11 Server.");
- LinuxXcbConnectionManagerBus::Handler::BusConnect();
+ AZ_Error("Application", m_xcbConnection != nullptr, "Unable to connect to X11 Server.");
+ XcbConnectionManagerBus::Handler::BusConnect();
}
- ~LinuxXcbConnectionManagerImpl()
+ ~XcbConnectionManagerImpl() override
{
- LinuxXcbConnectionManagerBus::Handler::BusDisconnect();
+ XcbConnectionManagerBus::Handler::BusDisconnect();
xcb_disconnect(m_xcbConnection);
}
@@ -42,53 +39,51 @@ namespace AzFramework
};
////////////////////////////////////////////////////////////////////////////////////////////////
- ApplicationLinux_xcb::ApplicationLinux_xcb()
+ XcbApplication::XcbApplication()
{
LinuxLifecycleEvents::Bus::Handler::BusConnect();
- m_xcbConnectionManager = AZStd::make_unique();
- if (LinuxXcbConnectionManagerInterface::Get() == nullptr)
+ m_xcbConnectionManager = AZStd::make_unique();
+ if (XcbConnectionManagerInterface::Get() == nullptr)
{
- LinuxXcbConnectionManagerInterface::Register(m_xcbConnectionManager.get());
+ XcbConnectionManagerInterface::Register(m_xcbConnectionManager.get());
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
- ApplicationLinux_xcb::~ApplicationLinux_xcb()
+ XcbApplication::~XcbApplication()
{
- if (LinuxXcbConnectionManagerInterface::Get() == m_xcbConnectionManager.get())
+ if (XcbConnectionManagerInterface::Get() == m_xcbConnectionManager.get())
{
- LinuxXcbConnectionManagerInterface::Unregister(m_xcbConnectionManager.get());
+ XcbConnectionManagerInterface::Unregister(m_xcbConnectionManager.get());
}
m_xcbConnectionManager.reset();
LinuxLifecycleEvents::Bus::Handler::BusDisconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void ApplicationLinux_xcb::PumpSystemEventLoopOnce()
+ void XcbApplication::PumpSystemEventLoopOnce()
{
if (xcb_connection_t* xcbConnection = m_xcbConnectionManager->GetXcbConnection())
{
if (xcb_generic_event_t* event = xcb_poll_for_event(xcbConnection))
{
- LinuxXcbEventHandlerBus::Broadcast(&LinuxXcbEventHandlerBus::Events::HandleXcbEvent, event);
+ XcbEventHandlerBus::Broadcast(&XcbEventHandlerBus::Events::HandleXcbEvent, event);
free(event);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void ApplicationLinux_xcb::PumpSystemEventLoopUntilEmpty()
+ void XcbApplication::PumpSystemEventLoopUntilEmpty()
{
if (xcb_connection_t* xcbConnection = m_xcbConnectionManager->GetXcbConnection())
{
while (xcb_generic_event_t* event = xcb_poll_for_event(xcbConnection))
{
- LinuxXcbEventHandlerBus::Broadcast(&LinuxXcbEventHandlerBus::Events::HandleXcbEvent, event);
+ XcbEventHandlerBus::Broadcast(&XcbEventHandlerBus::Events::HandleXcbEvent, event);
free(event);
}
}
}
-#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbApplication.h
similarity index 61%
rename from Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h
rename to Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbApplication.h
index fbd7f165d3..f27b5dd680 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbApplication.h
@@ -5,27 +5,24 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
+
#pragma once
#include
#include
+#include
-////////////////////////////////////////////////////////////////////////////////////////////////////
namespace AzFramework
{
-
-#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-
- ////////////////////////////////////////////////////////////////////////////////////////////////
- class ApplicationLinux_xcb
+ class XcbApplication
: public Application::Implementation
, public LinuxLifecycleEvents::Bus::Handler
{
public:
////////////////////////////////////////////////////////////////////////////////////////////
- AZ_CLASS_ALLOCATOR(ApplicationLinux_xcb, AZ::SystemAllocator, 0);
- ApplicationLinux_xcb();
- ~ApplicationLinux_xcb() override;
+ AZ_CLASS_ALLOCATOR(XcbApplication, AZ::SystemAllocator, 0);
+ XcbApplication();
+ ~XcbApplication() override;
////////////////////////////////////////////////////////////////////////////////////////////
// Application::Implementation
@@ -33,9 +30,6 @@ namespace AzFramework
void PumpSystemEventLoopUntilEmpty() override;
private:
- AZStd::unique_ptr m_xcbConnectionManager;
+ AZStd::unique_ptr m_xcbConnectionManager;
};
-
-#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbConnectionManager.h b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbConnectionManager.h
new file mode 100644
index 0000000000..daa5bf35af
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbConnectionManager.h
@@ -0,0 +1,42 @@
+/*
+ * 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
+
+namespace AzFramework
+{
+ class XcbConnectionManager
+ {
+ public:
+ AZ_RTTI(XcbConnectionManager, "{1F756E14-8D74-42FD-843C-4863307710DB}");
+
+ virtual ~XcbConnectionManager() = default;
+
+ virtual xcb_connection_t* GetXcbConnection() const = 0;
+ };
+
+ class XcbConnectionManagerBusTraits
+ : public AZ::EBusTraits
+ {
+ public:
+ //////////////////////////////////////////////////////////////////////////
+ // EBusTraits overrides
+ static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+ static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+ //////////////////////////////////////////////////////////////////////////
+ };
+
+ using XcbConnectionManagerBus = AZ::EBus;
+ using XcbConnectionManagerInterface = AZ::Interface;
+} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbEventHandler.h b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbEventHandler.h
new file mode 100644
index 0000000000..c6307755a7
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbEventHandler.h
@@ -0,0 +1,40 @@
+/*
+ * 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
+
+namespace AzFramework
+{
+ class XcbEventHandler
+ {
+ public:
+ AZ_RTTI(XcbEventHandler, "{3F756E14-8D74-42FD-843C-4863307710DB}");
+
+ virtual ~XcbEventHandler() = default;
+
+ virtual void HandleXcbEvent(xcb_generic_event_t* event) = 0;
+ };
+
+ class XcbEventHandlerBusTraits
+ : public AZ::EBusTraits
+ {
+ public:
+ //////////////////////////////////////////////////////////////////////////
+ // EBusTraits overrides
+ static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
+ static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+ //////////////////////////////////////////////////////////////////////////
+ };
+
+ using XcbEventHandlerBus = AZ::EBus;
+} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInputDeviceKeyboard.cpp b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInputDeviceKeyboard.cpp
new file mode 100644
index 0000000000..c971c3b793
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInputDeviceKeyboard.cpp
@@ -0,0 +1,271 @@
+/*
+ * 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
+
+#define explicit ExplicitIsACXXKeyword
+#include
+#undef explicit
+#include
+#include
+#include
+
+namespace AzFramework
+{
+ XcbInputDeviceKeyboard::XcbInputDeviceKeyboard(InputDeviceKeyboard& inputDevice)
+ : InputDeviceKeyboard::Implementation(inputDevice)
+ {
+ XcbEventHandlerBus::Handler::BusConnect();
+
+ auto* interface = AzFramework::XcbConnectionManagerInterface::Get();
+ if (!interface)
+ {
+ AZ_Warning("ApplicationLinux", false, "XCB interface not available");
+ return;
+ }
+
+ auto* connection = interface->GetXcbConnection();
+ if (!connection)
+ {
+ AZ_Warning("ApplicationLinux", false, "XCB connection not available");
+ return;
+ }
+
+ XcbStdFreePtr xkbUseExtensionReply{
+ xcb_xkb_use_extension_reply(connection, xcb_xkb_use_extension(connection, 1, 0), nullptr)
+ };
+ if (!xkbUseExtensionReply)
+ {
+ AZ_Warning("ApplicationLinux", false, "Failed to initialize the xkb extension");
+ return;
+ }
+ if (!xkbUseExtensionReply->supported)
+ {
+ AZ_Warning("ApplicationLinux", false, "The X server does not support the xkb extension");
+ return;
+ }
+
+ m_coreDeviceId = xkb_x11_get_core_keyboard_device_id(connection);
+
+ m_xkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
+ m_xkbKeymap.reset(xkb_x11_keymap_new_from_device(m_xkbContext.get(), connection, m_coreDeviceId, XKB_KEYMAP_COMPILE_NO_FLAGS));
+ m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), connection, m_coreDeviceId));
+
+ m_initialized = true;
+ }
+
+ bool XcbInputDeviceKeyboard::IsConnected() const
+ {
+ auto* connection = AzFramework::XcbConnectionManagerInterface::Get()->GetXcbConnection();
+ return connection && !xcb_connection_has_error(connection);
+ }
+
+ bool XcbInputDeviceKeyboard::HasTextEntryStarted() const
+ {
+ return false;
+ }
+
+ void XcbInputDeviceKeyboard::TextEntryStart(const InputDeviceKeyboard::VirtualKeyboardOptions& options)
+ {
+ }
+
+ void XcbInputDeviceKeyboard::TextEntryStop()
+ {
+ }
+
+ void XcbInputDeviceKeyboard::TickInputDevice()
+ {
+ ProcessRawEventQueues();
+ }
+
+ void XcbInputDeviceKeyboard::HandleXcbEvent(xcb_generic_event_t* event)
+ {
+ if (!m_initialized)
+ {
+ return;
+ }
+
+ switch (event->response_type & ~0x80)
+ {
+ case XCB_KEY_PRESS:
+ {
+ auto* keyPress = reinterpret_cast(event);
+
+ const InputChannelId* key = InputChannelFromKeyEvent(keyPress->detail);
+ if (key)
+ {
+ QueueRawKeyEvent(*key, true);
+ }
+ break;
+ }
+ case XCB_KEY_RELEASE:
+ {
+ auto* keyRelease = reinterpret_cast(event);
+
+ const InputChannelId* key = InputChannelFromKeyEvent(keyRelease->detail);
+ if (key)
+ {
+ QueueRawKeyEvent(*key, false);
+ }
+ break;
+ }
+ }
+ }
+
+ [[nodiscard]] const InputChannelId* XcbInputDeviceKeyboard::InputChannelFromKeyEvent(xcb_keycode_t code) const
+ {
+ const xcb_keysym_t keysym = xkb_state_key_get_one_sym(m_xkbState.get(), code);
+
+ switch(keysym)
+ {
+ case XKB_KEY_0: return &InputDeviceKeyboard::Key::Alphanumeric0;
+ case XKB_KEY_1: return &InputDeviceKeyboard::Key::Alphanumeric1;
+ case XKB_KEY_2: return &InputDeviceKeyboard::Key::Alphanumeric2;
+ case XKB_KEY_3: return &InputDeviceKeyboard::Key::Alphanumeric3;
+ case XKB_KEY_4: return &InputDeviceKeyboard::Key::Alphanumeric4;
+ case XKB_KEY_5: return &InputDeviceKeyboard::Key::Alphanumeric5;
+ case XKB_KEY_6: return &InputDeviceKeyboard::Key::Alphanumeric6;
+ case XKB_KEY_7: return &InputDeviceKeyboard::Key::Alphanumeric7;
+ case XKB_KEY_8: return &InputDeviceKeyboard::Key::Alphanumeric8;
+ case XKB_KEY_9: return &InputDeviceKeyboard::Key::Alphanumeric9;
+ case XKB_KEY_A:
+ case XKB_KEY_a: return &InputDeviceKeyboard::Key::AlphanumericA;
+ case XKB_KEY_B:
+ case XKB_KEY_b: return &InputDeviceKeyboard::Key::AlphanumericB;
+ case XKB_KEY_C:
+ case XKB_KEY_c: return &InputDeviceKeyboard::Key::AlphanumericC;
+ case XKB_KEY_D:
+ case XKB_KEY_d: return &InputDeviceKeyboard::Key::AlphanumericD;
+ case XKB_KEY_E:
+ case XKB_KEY_e: return &InputDeviceKeyboard::Key::AlphanumericE;
+ case XKB_KEY_F:
+ case XKB_KEY_f: return &InputDeviceKeyboard::Key::AlphanumericF;
+ case XKB_KEY_G:
+ case XKB_KEY_g: return &InputDeviceKeyboard::Key::AlphanumericG;
+ case XKB_KEY_H:
+ case XKB_KEY_h: return &InputDeviceKeyboard::Key::AlphanumericH;
+ case XKB_KEY_I:
+ case XKB_KEY_i: return &InputDeviceKeyboard::Key::AlphanumericI;
+ case XKB_KEY_J:
+ case XKB_KEY_j: return &InputDeviceKeyboard::Key::AlphanumericJ;
+ case XKB_KEY_K:
+ case XKB_KEY_k: return &InputDeviceKeyboard::Key::AlphanumericK;
+ case XKB_KEY_L:
+ case XKB_KEY_l: return &InputDeviceKeyboard::Key::AlphanumericL;
+ case XKB_KEY_M:
+ case XKB_KEY_m: return &InputDeviceKeyboard::Key::AlphanumericM;
+ case XKB_KEY_N:
+ case XKB_KEY_n: return &InputDeviceKeyboard::Key::AlphanumericN;
+ case XKB_KEY_O:
+ case XKB_KEY_o: return &InputDeviceKeyboard::Key::AlphanumericO;
+ case XKB_KEY_P:
+ case XKB_KEY_p: return &InputDeviceKeyboard::Key::AlphanumericP;
+ case XKB_KEY_Q:
+ case XKB_KEY_q: return &InputDeviceKeyboard::Key::AlphanumericQ;
+ case XKB_KEY_R:
+ case XKB_KEY_r: return &InputDeviceKeyboard::Key::AlphanumericR;
+ case XKB_KEY_S:
+ case XKB_KEY_s: return &InputDeviceKeyboard::Key::AlphanumericS;
+ case XKB_KEY_T:
+ case XKB_KEY_t: return &InputDeviceKeyboard::Key::AlphanumericT;
+ case XKB_KEY_U:
+ case XKB_KEY_u: return &InputDeviceKeyboard::Key::AlphanumericU;
+ case XKB_KEY_V:
+ case XKB_KEY_v: return &InputDeviceKeyboard::Key::AlphanumericV;
+ case XKB_KEY_W:
+ case XKB_KEY_w: return &InputDeviceKeyboard::Key::AlphanumericW;
+ case XKB_KEY_X:
+ case XKB_KEY_x: return &InputDeviceKeyboard::Key::AlphanumericX;
+ case XKB_KEY_Y:
+ case XKB_KEY_y: return &InputDeviceKeyboard::Key::AlphanumericY;
+ case XKB_KEY_Z:
+ case XKB_KEY_z: return &InputDeviceKeyboard::Key::AlphanumericZ;
+ case XKB_KEY_BackSpace: return &InputDeviceKeyboard::Key::EditBackspace;
+ case XKB_KEY_Caps_Lock: return &InputDeviceKeyboard::Key::EditCapsLock;
+ case XKB_KEY_Return: return &InputDeviceKeyboard::Key::EditEnter;
+ case XKB_KEY_space: return &InputDeviceKeyboard::Key::EditSpace;
+ case XKB_KEY_Tab: return &InputDeviceKeyboard::Key::EditTab;
+ case XKB_KEY_Escape: return &InputDeviceKeyboard::Key::Escape;
+ case XKB_KEY_F1: return &InputDeviceKeyboard::Key::Function01;
+ case XKB_KEY_F2: return &InputDeviceKeyboard::Key::Function02;
+ case XKB_KEY_F3: return &InputDeviceKeyboard::Key::Function03;
+ case XKB_KEY_F4: return &InputDeviceKeyboard::Key::Function04;
+ case XKB_KEY_F5: return &InputDeviceKeyboard::Key::Function05;
+ case XKB_KEY_F6: return &InputDeviceKeyboard::Key::Function06;
+ case XKB_KEY_F7: return &InputDeviceKeyboard::Key::Function07;
+ case XKB_KEY_F8: return &InputDeviceKeyboard::Key::Function08;
+ case XKB_KEY_F9: return &InputDeviceKeyboard::Key::Function09;
+ case XKB_KEY_F10: return &InputDeviceKeyboard::Key::Function10;
+ case XKB_KEY_F11: return &InputDeviceKeyboard::Key::Function11;
+ case XKB_KEY_F12: return &InputDeviceKeyboard::Key::Function12;
+ case XKB_KEY_F13: return &InputDeviceKeyboard::Key::Function13;
+ case XKB_KEY_F14: return &InputDeviceKeyboard::Key::Function14;
+ case XKB_KEY_F15: return &InputDeviceKeyboard::Key::Function15;
+ case XKB_KEY_F16: return &InputDeviceKeyboard::Key::Function16;
+ case XKB_KEY_F17: return &InputDeviceKeyboard::Key::Function17;
+ case XKB_KEY_F18: return &InputDeviceKeyboard::Key::Function18;
+ case XKB_KEY_F19: return &InputDeviceKeyboard::Key::Function19;
+ case XKB_KEY_F20: return &InputDeviceKeyboard::Key::Function20;
+ case XKB_KEY_Alt_L: return &InputDeviceKeyboard::Key::ModifierAltL;
+ case XKB_KEY_Alt_R: return &InputDeviceKeyboard::Key::ModifierAltR;
+ case XKB_KEY_Control_L: return &InputDeviceKeyboard::Key::ModifierCtrlL;
+ case XKB_KEY_Control_R: return &InputDeviceKeyboard::Key::ModifierCtrlR;
+ case XKB_KEY_Shift_L: return &InputDeviceKeyboard::Key::ModifierShiftL;
+ case XKB_KEY_Shift_R: return &InputDeviceKeyboard::Key::ModifierShiftR;
+ case XKB_KEY_Super_L: return &InputDeviceKeyboard::Key::ModifierSuperL;
+ case XKB_KEY_Super_R: return &InputDeviceKeyboard::Key::ModifierSuperR;
+ case XKB_KEY_Down: return &InputDeviceKeyboard::Key::NavigationArrowDown;
+ case XKB_KEY_Left: return &InputDeviceKeyboard::Key::NavigationArrowLeft;
+ case XKB_KEY_Right: return &InputDeviceKeyboard::Key::NavigationArrowRight;
+ case XKB_KEY_Up: return &InputDeviceKeyboard::Key::NavigationArrowUp;
+ case XKB_KEY_Delete: return &InputDeviceKeyboard::Key::NavigationDelete;
+ case XKB_KEY_End: return &InputDeviceKeyboard::Key::NavigationEnd;
+ case XKB_KEY_Home: return &InputDeviceKeyboard::Key::NavigationHome;
+ case XKB_KEY_Insert: return &InputDeviceKeyboard::Key::NavigationInsert;
+ case XKB_KEY_Page_Down: return &InputDeviceKeyboard::Key::NavigationPageDown;
+ case XKB_KEY_Page_Up: return &InputDeviceKeyboard::Key::NavigationPageUp;
+ case XKB_KEY_Num_Lock: return &InputDeviceKeyboard::Key::NumLock;
+ case XKB_KEY_KP_0: return &InputDeviceKeyboard::Key::NumPad0;
+ case XKB_KEY_KP_1: return &InputDeviceKeyboard::Key::NumPad1;
+ case XKB_KEY_KP_2: return &InputDeviceKeyboard::Key::NumPad2;
+ case XKB_KEY_KP_3: return &InputDeviceKeyboard::Key::NumPad3;
+ case XKB_KEY_KP_4: return &InputDeviceKeyboard::Key::NumPad4;
+ case XKB_KEY_KP_5: return &InputDeviceKeyboard::Key::NumPad5;
+ case XKB_KEY_KP_6: return &InputDeviceKeyboard::Key::NumPad6;
+ case XKB_KEY_KP_7: return &InputDeviceKeyboard::Key::NumPad7;
+ case XKB_KEY_KP_8: return &InputDeviceKeyboard::Key::NumPad8;
+ case XKB_KEY_KP_9: return &InputDeviceKeyboard::Key::NumPad9;
+ case XKB_KEY_KP_Add: return &InputDeviceKeyboard::Key::NumPadAdd;
+ case XKB_KEY_KP_Decimal: return &InputDeviceKeyboard::Key::NumPadDecimal;
+ case XKB_KEY_KP_Divide: return &InputDeviceKeyboard::Key::NumPadDivide;
+ case XKB_KEY_KP_Enter: return &InputDeviceKeyboard::Key::NumPadEnter;
+ case XKB_KEY_KP_Multiply: return &InputDeviceKeyboard::Key::NumPadMultiply;
+ case XKB_KEY_KP_Subtract: return &InputDeviceKeyboard::Key::NumPadSubtract;
+ case XKB_KEY_apostrophe: return &InputDeviceKeyboard::Key::PunctuationApostrophe;
+ case XKB_KEY_backslash: return &InputDeviceKeyboard::Key::PunctuationBackslash;
+ case XKB_KEY_bracketleft: return &InputDeviceKeyboard::Key::PunctuationBracketL;
+ case XKB_KEY_bracketright: return &InputDeviceKeyboard::Key::PunctuationBracketR;
+ case XKB_KEY_comma: return &InputDeviceKeyboard::Key::PunctuationComma;
+ case XKB_KEY_equal: return &InputDeviceKeyboard::Key::PunctuationEquals;
+ case XKB_KEY_hyphen: return &InputDeviceKeyboard::Key::PunctuationHyphen;
+ case XKB_KEY_period: return &InputDeviceKeyboard::Key::PunctuationPeriod;
+ case XKB_KEY_semicolon: return &InputDeviceKeyboard::Key::PunctuationSemicolon;
+ case XKB_KEY_slash: return &InputDeviceKeyboard::Key::PunctuationSlash;
+ case XKB_KEY_grave:
+ case XKB_KEY_asciitilde: return &InputDeviceKeyboard::Key::PunctuationTilde;
+ case XKB_KEY_ISO_Group_Shift: return &InputDeviceKeyboard::Key::SupplementaryISO;
+ case XKB_KEY_Pause: return &InputDeviceKeyboard::Key::WindowsSystemPause;
+ case XKB_KEY_Print: return &InputDeviceKeyboard::Key::WindowsSystemPrint;
+ case XKB_KEY_Scroll_Lock: return &InputDeviceKeyboard::Key::WindowsSystemScrollLock;
+ default: return nullptr;
+ }
+ }
+} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInputDeviceKeyboard.h b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInputDeviceKeyboard.h
new file mode 100644
index 0000000000..de65941a67
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInputDeviceKeyboard.h
@@ -0,0 +1,46 @@
+/*
+ * 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
+
+namespace AzFramework
+{
+ class XcbInputDeviceKeyboard
+ : public InputDeviceKeyboard::Implementation
+ , public XcbEventHandlerBus::Handler
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(XcbInputDeviceKeyboard, AZ::SystemAllocator, 0);
+
+ using InputDeviceKeyboard::Implementation::Implementation;
+ XcbInputDeviceKeyboard(InputDeviceKeyboard& inputDevice);
+
+ bool IsConnected() const override;
+
+ bool HasTextEntryStarted() const override;
+ void TextEntryStart(const InputDeviceKeyboard::VirtualKeyboardOptions& options) override;
+ void TextEntryStop() override;
+ void TickInputDevice() override;
+
+ void HandleXcbEvent(xcb_generic_event_t* event) override;
+
+ private:
+ [[nodiscard]] const InputChannelId* InputChannelFromKeyEvent(xcb_keycode_t code) const;
+
+ XcbUniquePtr m_xkbContext;
+ XcbUniquePtr m_xkbKeymap;
+ XcbUniquePtr m_xkbState;
+ int m_coreDeviceId{-1};
+ bool m_initialized{false};
+ };
+} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInterface.h b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInterface.h
new file mode 100644
index 0000000000..838048b174
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbInterface.h
@@ -0,0 +1,38 @@
+/*
+ * 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
+
+namespace AzFramework
+{
+ // @brief Wrap a function pointer in a type
+ // This serves as a convenient way to wrap a function pointer in a given
+ // type. That type can then be used in a `unique_ptr` or `shared_ptr`.
+ // Using a type instead of a function pointer by value prevents the need to
+ // copy the pointer when copying the smart poiner.
+ template
+ struct XcbDeleterFreeFunctionWrapper
+ {
+ using value_type = decltype(Callable);
+ static constexpr value_type s_value = Callable;
+ constexpr operator value_type() const noexcept
+ {
+ return s_value;
+ }
+ };
+
+ template
+ using XcbUniquePtr = AZStd::unique_ptr>;
+
+ template
+ using XcbStdFreePtr = XcbUniquePtr;
+} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbNativeWindow.cpp
similarity index 85%
rename from Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp
rename to Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbNativeWindow.cpp
index cfc0222214..6ab97fd616 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbNativeWindow.cpp
@@ -6,41 +6,37 @@
*
*/
-#include
#include
#include
-#include
+#include
+#include
-#include "NativeWindow_Linux_xcb.h"
+#include
namespace AzFramework
{
-#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-
- [[maybe_unused]] const char LinuxXcbErrorWindow[] = "NativeWindow_Linux_xcb";
+ [[maybe_unused]] const char XcbErrorWindow[] = "XcbNativeWindow";
static constexpr uint8_t s_XcbFormatDataSize = 32; // Format indicator for xcb for client messages
static constexpr uint16_t s_DefaultXcbWindowBorderWidth = 4; // The default border with in pixels if a border was specified
static constexpr uint8_t s_XcbResponseTypeMask = 0x7f; // Mask to extract the specific event type from an xcb event
////////////////////////////////////////////////////////////////////////////////////////////////
- NativeWindowImpl_Linux_xcb::NativeWindowImpl_Linux_xcb()
+ XcbNativeWindow::XcbNativeWindow()
: NativeWindow::Implementation()
{
- if (auto xcbConnectionManager = AzFramework::LinuxXcbConnectionManagerInterface::Get();
+ if (auto xcbConnectionManager = AzFramework::XcbConnectionManagerInterface::Get();
xcbConnectionManager != nullptr)
{
m_xcbConnection = xcbConnectionManager->GetXcbConnection();
}
- AZ_Error(LinuxXcbErrorWindow, m_xcbConnection != nullptr, "Unable to get XCB Connection");
+ AZ_Error(XcbErrorWindow, m_xcbConnection != nullptr, "Unable to get XCB Connection");
}
////////////////////////////////////////////////////////////////////////////////////////////////
- NativeWindowImpl_Linux_xcb::~NativeWindowImpl_Linux_xcb()
- {
- }
+ XcbNativeWindow::~XcbNativeWindow() = default;
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::InitWindow(const AZStd::string& title,
+ void XcbNativeWindow::InitWindow(const AZStd::string& title,
const WindowGeometry& geometry,
const WindowStyleMasks& styleMasks)
{
@@ -98,13 +94,13 @@ namespace AzFramework
xcb_intern_atom_cookie_t cookieProtocol = xcb_intern_atom(m_xcbConnection, 1, strlen(wmProtocolString), wmProtocolString);
xcb_intern_atom_reply_t* replyProtocol = xcb_intern_atom_reply(m_xcbConnection, cookieProtocol, nullptr);
- AZ_Error(LinuxXcbErrorWindow, replyProtocol != nullptr, "Unable to query xcb '%s' atom", wmProtocolString);
+ AZ_Error(XcbErrorWindow, replyProtocol != nullptr, "Unable to query xcb '%s' atom", wmProtocolString);
m_xcbAtomProtocols = replyProtocol->atom;
const static char* wmDeleteWindowString = "WM_DELETE_WINDOW";
xcb_intern_atom_cookie_t cookieDeleteWindow = xcb_intern_atom(m_xcbConnection, 0, strlen(wmDeleteWindowString), wmDeleteWindowString);
xcb_intern_atom_reply_t* replyDeleteWindow = xcb_intern_atom_reply(m_xcbConnection, cookieDeleteWindow, nullptr);
- AZ_Error(LinuxXcbErrorWindow, replyDeleteWindow != nullptr, "Unable to query xcb '%s' atom", wmDeleteWindowString);
+ AZ_Error(XcbErrorWindow, replyDeleteWindow != nullptr, "Unable to query xcb '%s' atom", wmDeleteWindowString);
m_xcbAtomDeleteWindow = replyDeleteWindow->atom;
xcbCheckResult = xcb_change_property_checked(m_xcbConnection,
@@ -123,9 +119,9 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::Activate()
+ void XcbNativeWindow::Activate()
{
- LinuxXcbEventHandlerBus::Handler::BusConnect();
+ XcbEventHandlerBus::Handler::BusConnect();
if (!m_activated) // nothing to do if window was already activated
{
@@ -137,7 +133,7 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::Deactivate()
+ void XcbNativeWindow::Deactivate()
{
if (m_activated) // nothing to do if window was already deactivated
{
@@ -148,17 +144,17 @@ namespace AzFramework
xcb_unmap_window(m_xcbConnection, m_xcbWindow);
xcb_flush(m_xcbConnection);
}
- LinuxXcbEventHandlerBus::Handler::BusDisconnect();
+ XcbEventHandlerBus::Handler::BusDisconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////////
- NativeWindowHandle NativeWindowImpl_Linux_xcb::GetWindowHandle() const
+ NativeWindowHandle XcbNativeWindow::GetWindowHandle() const
{
return reinterpret_cast(m_xcbWindow);
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::SetWindowTitle(const AZStd::string& title)
+ void XcbNativeWindow::SetWindowTitle(const AZStd::string& title)
{
xcb_void_cookie_t xcbCheckResult;
xcbCheckResult = xcb_change_property(m_xcbConnection,
@@ -173,7 +169,7 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::ResizeClientArea(WindowSize clientAreaSize)
+ void XcbNativeWindow::ResizeClientArea(WindowSize clientAreaSize)
{
const uint32_t values[] = { clientAreaSize.m_width, clientAreaSize.m_height };
@@ -184,7 +180,7 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- uint32_t NativeWindowImpl_Linux_xcb::GetDisplayRefreshRate() const
+ uint32_t XcbNativeWindow::GetDisplayRefreshRate() const
{
// [GFX TODO][GHI - 2678]
// Using 60 for now until proper support is added
@@ -192,7 +188,7 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- bool NativeWindowImpl_Linux_xcb::ValidateXcbResult(xcb_void_cookie_t cookie)
+ bool XcbNativeWindow::ValidateXcbResult(xcb_void_cookie_t cookie)
{
bool result = true;
if (xcb_generic_error_t* error = xcb_request_check(m_xcbConnection, cookie))
@@ -204,7 +200,7 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::HandleXcbEvent(xcb_generic_event_t* event)
+ void XcbNativeWindow::HandleXcbEvent(xcb_generic_event_t* event)
{
switch (event->response_type & s_XcbResponseTypeMask)
{
@@ -233,7 +229,7 @@ namespace AzFramework
}
////////////////////////////////////////////////////////////////////////////////////////////////
- void NativeWindowImpl_Linux_xcb::WindowSizeChanged(const uint32_t width, const uint32_t height)
+ void XcbNativeWindow::WindowSizeChanged(const uint32_t width, const uint32_t height)
{
if (m_width != width || m_height != height)
{
@@ -246,7 +242,4 @@ namespace AzFramework
}
}
}
-
-#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbNativeWindow.h
similarity index 78%
rename from Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h
rename to Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbNativeWindow.h
index 40181395e4..36737e24e8 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/AzFramework/XcbNativeWindow.h
@@ -5,24 +5,25 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
+
#pragma once
-#include
#include
#include
+#include
+
#include
namespace AzFramework
{
-#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
- class NativeWindowImpl_Linux_xcb final
+ class XcbNativeWindow final
: public NativeWindow::Implementation
- , public LinuxXcbEventHandlerBus::Handler
+ , public XcbEventHandlerBus::Handler
{
public:
- AZ_CLASS_ALLOCATOR(NativeWindowImpl_Linux_xcb, AZ::SystemAllocator, 0);
- NativeWindowImpl_Linux_xcb();
- ~NativeWindowImpl_Linux_xcb() override;
+ AZ_CLASS_ALLOCATOR(XcbNativeWindow, AZ::SystemAllocator, 0);
+ XcbNativeWindow();
+ ~XcbNativeWindow() override;
////////////////////////////////////////////////////////////////////////////////////////////
// NativeWindow::Implementation
@@ -37,7 +38,7 @@ namespace AzFramework
uint32_t GetDisplayRefreshRate() const override;
////////////////////////////////////////////////////////////////////////////////////////////
- // LinuxXcbEventHandlerBus::Handler
+ // XcbEventHandlerBus::Handler
void HandleXcbEvent(xcb_generic_event_t* event) override;
private:
@@ -49,6 +50,4 @@ namespace AzFramework
xcb_atom_t m_xcbAtomProtocols;
xcb_atom_t m_xcbAtomDeleteWindow;
};
-#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Common/Xcb/azframework_xcb_files.cmake b/Code/Framework/AzFramework/Platform/Common/Xcb/azframework_xcb_files.cmake
new file mode 100644
index 0000000000..68de710fa1
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Common/Xcb/azframework_xcb_files.cmake
@@ -0,0 +1,18 @@
+#
+# 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
+#
+#
+
+set(FILES
+ AzFramework/XcbApplication.cpp
+ AzFramework/XcbApplication.h
+ AzFramework/XcbConnectionManager.h
+ AzFramework/XcbInputDeviceKeyboard.cpp
+ AzFramework/XcbInputDeviceKeyboard.h
+ AzFramework/XcbInterface.h
+ AzFramework/XcbNativeWindow.cpp
+ AzFramework/XcbNativeWindow.h
+)
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h
index 833f4019f8..adf3ee0bdd 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h
+++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h
@@ -12,10 +12,6 @@
#include
#include
-#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
-#include
-#endif // LY_COMPILE_DEFINITIONS
-
namespace AzFramework
{
class LinuxLifecycleEvents
@@ -30,54 +26,4 @@ namespace AzFramework
using Bus = AZ::EBus;
};
-
-#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
- class LinuxXcbConnectionManager
- {
- public:
- AZ_RTTI(LinuxXcbConnectionManager, "{1F756E14-8D74-42FD-843C-4863307710DB}");
-
- virtual ~LinuxXcbConnectionManager() = default;
-
- virtual xcb_connection_t* GetXcbConnection() const = 0;
- };
-
- class LinuxXcbConnectionManagerBusTraits
- : public AZ::EBusTraits
- {
- public:
- //////////////////////////////////////////////////////////////////////////
- // EBusTraits overrides
- static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
- static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
- //////////////////////////////////////////////////////////////////////////
- };
-
- using LinuxXcbConnectionManagerBus = AZ::EBus;
- using LinuxXcbConnectionManagerInterface = AZ::Interface;
-
- class LinuxXcbEventHandler
- {
- public:
- AZ_RTTI(LinuxXcbEventHandler, "{3F756E14-8D74-42FD-843C-4863307710DB}");
-
- virtual ~LinuxXcbEventHandler() = default;
-
- virtual void HandleXcbEvent(xcb_generic_event_t* event) = 0;
- };
-
- class LinuxXcbEventHandlerBusTraits
- : public AZ::EBusTraits
- {
- public:
- //////////////////////////////////////////////////////////////////////////
- // EBusTraits overrides
- static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
- static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
- //////////////////////////////////////////////////////////////////////////
- };
-
- using LinuxXcbEventHandlerBus = AZ::EBus;
-
-#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp
index 59602fe788..158240210e 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp
+++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp
@@ -8,7 +8,9 @@
#include
-#include "Application_Linux_xcb.h"
+#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
+#include
+#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace AzFramework
@@ -17,7 +19,7 @@ namespace AzFramework
Application::Implementation* Application::Implementation::Create()
{
#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
- return aznew ApplicationLinux_xcb();
+ return aznew XcbApplication();
#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND
#error "Linux Window Manager Wayland not supported."
return nullptr;
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Linux.cpp
new file mode 100644
index 0000000000..d1f90c3052
--- /dev/null
+++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Linux.cpp
@@ -0,0 +1,27 @@
+/*
+ * 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
+ *
+ */
+
+#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
+#include
+#endif
+
+namespace AzFramework
+{
+ InputDeviceKeyboard::Implementation* InputDeviceKeyboard::Implementation::Create(InputDeviceKeyboard& inputDevice)
+ {
+#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
+ return aznew XcbInputDeviceKeyboard(inputDevice);
+#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND
+ #error "Linux Window Manager Wayland not supported."
+ return nullptr;
+#else
+ #error "Linux Window Manager not recognized."
+ return nullptr;
+#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
+ }
+} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_xcb.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_xcb.cpp
deleted file mode 100644
index 8ff4c72d42..0000000000
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_xcb.cpp
+++ /dev/null
@@ -1,293 +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
-#include
-#include
-
-#define explicit ExplicitIsACXXKeyword
-#include
-#undef explicit
-#include
-#include
-#include
-
-namespace AzFramework
-{
- class InputDeviceKeyboardXcb
- : public InputDeviceKeyboard::Implementation
- , public LinuxXcbEventHandlerBus::Handler
- {
- public:
- AZ_CLASS_ALLOCATOR(InputDeviceKeyboardXcb, AZ::SystemAllocator, 0);
-
- using InputDeviceKeyboard::Implementation::Implementation;
- InputDeviceKeyboardXcb(InputDeviceKeyboard& inputDevice)
- : InputDeviceKeyboard::Implementation(inputDevice)
- {
- LinuxXcbEventHandlerBus::Handler::BusConnect();
-
- auto* interface = AzFramework::LinuxXcbConnectionManagerInterface::Get();
- if (!interface)
- {
- AZ_Warning("ApplicationLinux", false, "XCB interface not available");
- return;
- }
-
- auto* connection = AzFramework::LinuxXcbConnectionManagerInterface::Get()->GetXcbConnection();
- if (!connection)
- {
- AZ_Warning("ApplicationLinux", false, "XCB connection not available");
- return;
- }
-
- AZStd::unique_ptr> xkbUseExtensionReply{
- xcb_xkb_use_extension_reply(connection, xcb_xkb_use_extension(connection, 1, 0), nullptr)
- };
- if (!xkbUseExtensionReply)
- {
- AZ_Warning("ApplicationLinux", false, "Failed to initialize the xkb extension");
- return;
- }
- if (!xkbUseExtensionReply->supported)
- {
- AZ_Warning("ApplicationLinux", false, "The X server does not support the xkb extension");
- return;
- }
-
- m_coreDeviceId = xkb_x11_get_core_keyboard_device_id(connection);
-
- m_xkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
- m_xkbKeymap.reset(xkb_x11_keymap_new_from_device(m_xkbContext.get(), connection, m_coreDeviceId, XKB_KEYMAP_COMPILE_NO_FLAGS));
- m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), connection, m_coreDeviceId));
-
- m_initialized = true;
- }
-
- bool IsConnected() const override
- {
- return m_initialized;
- }
-
- bool HasTextEntryStarted() const override
- {
- return false;
- }
-
- void TextEntryStart(const InputDeviceKeyboard::VirtualKeyboardOptions& options) override
- {
- }
-
- void TextEntryStop() override
- {
- }
-
- void TickInputDevice() override
- {
- ProcessRawEventQueues();
- }
-
- void HandleXcbEvent(xcb_generic_event_t* event) override
- {
- if (!IsConnected())
- {
- return;
- }
-
- switch (event->response_type & ~0x80)
- {
- case XCB_KEY_PRESS:
- {
- auto* keyPress = reinterpret_cast(event);
-
- const InputChannelId* key = InputChannelFromKeyEvent(keyPress->detail);
- if (key)
- {
- QueueRawKeyEvent(*key, true);
- }
- break;
- }
- case XCB_KEY_RELEASE:
- {
- auto* keyRelease = reinterpret_cast(event);
-
- const InputChannelId* key = InputChannelFromKeyEvent(keyRelease->detail);
- if (key)
- {
- QueueRawKeyEvent(*key, false);
- }
- break;
- }
- }
- }
-
- private:
- [[nodiscard]] const InputChannelId* InputChannelFromKeyEvent(xcb_keycode_t code) const
- {
- const xcb_keysym_t keysym = xkb_state_key_get_one_sym(m_xkbState.get(), code);
-
- switch(keysym)
- {
- case XKB_KEY_0: return &InputDeviceKeyboard::Key::Alphanumeric0;
- case XKB_KEY_1: return &InputDeviceKeyboard::Key::Alphanumeric1;
- case XKB_KEY_2: return &InputDeviceKeyboard::Key::Alphanumeric2;
- case XKB_KEY_3: return &InputDeviceKeyboard::Key::Alphanumeric3;
- case XKB_KEY_4: return &InputDeviceKeyboard::Key::Alphanumeric4;
- case XKB_KEY_5: return &InputDeviceKeyboard::Key::Alphanumeric5;
- case XKB_KEY_6: return &InputDeviceKeyboard::Key::Alphanumeric6;
- case XKB_KEY_7: return &InputDeviceKeyboard::Key::Alphanumeric7;
- case XKB_KEY_8: return &InputDeviceKeyboard::Key::Alphanumeric8;
- case XKB_KEY_9: return &InputDeviceKeyboard::Key::Alphanumeric9;
- case XKB_KEY_A:
- case XKB_KEY_a: return &InputDeviceKeyboard::Key::AlphanumericA;
- case XKB_KEY_B:
- case XKB_KEY_b: return &InputDeviceKeyboard::Key::AlphanumericB;
- case XKB_KEY_C:
- case XKB_KEY_c: return &InputDeviceKeyboard::Key::AlphanumericC;
- case XKB_KEY_D:
- case XKB_KEY_d: return &InputDeviceKeyboard::Key::AlphanumericD;
- case XKB_KEY_E:
- case XKB_KEY_e: return &InputDeviceKeyboard::Key::AlphanumericE;
- case XKB_KEY_F:
- case XKB_KEY_f: return &InputDeviceKeyboard::Key::AlphanumericF;
- case XKB_KEY_G:
- case XKB_KEY_g: return &InputDeviceKeyboard::Key::AlphanumericG;
- case XKB_KEY_H:
- case XKB_KEY_h: return &InputDeviceKeyboard::Key::AlphanumericH;
- case XKB_KEY_I:
- case XKB_KEY_i: return &InputDeviceKeyboard::Key::AlphanumericI;
- case XKB_KEY_J:
- case XKB_KEY_j: return &InputDeviceKeyboard::Key::AlphanumericJ;
- case XKB_KEY_K:
- case XKB_KEY_k: return &InputDeviceKeyboard::Key::AlphanumericK;
- case XKB_KEY_L:
- case XKB_KEY_l: return &InputDeviceKeyboard::Key::AlphanumericL;
- case XKB_KEY_M:
- case XKB_KEY_m: return &InputDeviceKeyboard::Key::AlphanumericM;
- case XKB_KEY_N:
- case XKB_KEY_n: return &InputDeviceKeyboard::Key::AlphanumericN;
- case XKB_KEY_O:
- case XKB_KEY_o: return &InputDeviceKeyboard::Key::AlphanumericO;
- case XKB_KEY_P:
- case XKB_KEY_p: return &InputDeviceKeyboard::Key::AlphanumericP;
- case XKB_KEY_Q:
- case XKB_KEY_q: return &InputDeviceKeyboard::Key::AlphanumericQ;
- case XKB_KEY_R:
- case XKB_KEY_r: return &InputDeviceKeyboard::Key::AlphanumericR;
- case XKB_KEY_S:
- case XKB_KEY_s: return &InputDeviceKeyboard::Key::AlphanumericS;
- case XKB_KEY_T:
- case XKB_KEY_t: return &InputDeviceKeyboard::Key::AlphanumericT;
- case XKB_KEY_U:
- case XKB_KEY_u: return &InputDeviceKeyboard::Key::AlphanumericU;
- case XKB_KEY_V:
- case XKB_KEY_v: return &InputDeviceKeyboard::Key::AlphanumericV;
- case XKB_KEY_W:
- case XKB_KEY_w: return &InputDeviceKeyboard::Key::AlphanumericW;
- case XKB_KEY_X:
- case XKB_KEY_x: return &InputDeviceKeyboard::Key::AlphanumericX;
- case XKB_KEY_Y:
- case XKB_KEY_y: return &InputDeviceKeyboard::Key::AlphanumericY;
- case XKB_KEY_Z:
- case XKB_KEY_z: return &InputDeviceKeyboard::Key::AlphanumericZ;
- case XKB_KEY_BackSpace: return &InputDeviceKeyboard::Key::EditBackspace;
- case XKB_KEY_Caps_Lock: return &InputDeviceKeyboard::Key::EditCapsLock;
- case XKB_KEY_Return: return &InputDeviceKeyboard::Key::EditEnter;
- case XKB_KEY_space: return &InputDeviceKeyboard::Key::EditSpace;
- case XKB_KEY_Tab: return &InputDeviceKeyboard::Key::EditTab;
- case XKB_KEY_Escape: return &InputDeviceKeyboard::Key::Escape;
- case XKB_KEY_F1: return &InputDeviceKeyboard::Key::Function01;
- case XKB_KEY_F2: return &InputDeviceKeyboard::Key::Function02;
- case XKB_KEY_F3: return &InputDeviceKeyboard::Key::Function03;
- case XKB_KEY_F4: return &InputDeviceKeyboard::Key::Function04;
- case XKB_KEY_F5: return &InputDeviceKeyboard::Key::Function05;
- case XKB_KEY_F6: return &InputDeviceKeyboard::Key::Function06;
- case XKB_KEY_F7: return &InputDeviceKeyboard::Key::Function07;
- case XKB_KEY_F8: return &InputDeviceKeyboard::Key::Function08;
- case XKB_KEY_F9: return &InputDeviceKeyboard::Key::Function09;
- case XKB_KEY_F10: return &InputDeviceKeyboard::Key::Function10;
- case XKB_KEY_F11: return &InputDeviceKeyboard::Key::Function11;
- case XKB_KEY_F12: return &InputDeviceKeyboard::Key::Function12;
- case XKB_KEY_F13: return &InputDeviceKeyboard::Key::Function13;
- case XKB_KEY_F14: return &InputDeviceKeyboard::Key::Function14;
- case XKB_KEY_F15: return &InputDeviceKeyboard::Key::Function15;
- case XKB_KEY_F16: return &InputDeviceKeyboard::Key::Function16;
- case XKB_KEY_F17: return &InputDeviceKeyboard::Key::Function17;
- case XKB_KEY_F18: return &InputDeviceKeyboard::Key::Function18;
- case XKB_KEY_F19: return &InputDeviceKeyboard::Key::Function19;
- case XKB_KEY_F20: return &InputDeviceKeyboard::Key::Function20;
- case XKB_KEY_Alt_L: return &InputDeviceKeyboard::Key::ModifierAltL;
- case XKB_KEY_Alt_R: return &InputDeviceKeyboard::Key::ModifierAltR;
- case XKB_KEY_Control_L: return &InputDeviceKeyboard::Key::ModifierCtrlL;
- case XKB_KEY_Control_R: return &InputDeviceKeyboard::Key::ModifierCtrlR;
- case XKB_KEY_Shift_L: return &InputDeviceKeyboard::Key::ModifierShiftL;
- case XKB_KEY_Shift_R: return &InputDeviceKeyboard::Key::ModifierShiftR;
- case XKB_KEY_Super_L: return &InputDeviceKeyboard::Key::ModifierSuperL;
- case XKB_KEY_Super_R: return &InputDeviceKeyboard::Key::ModifierSuperR;
- case XKB_KEY_Down: return &InputDeviceKeyboard::Key::NavigationArrowDown;
- case XKB_KEY_Left: return &InputDeviceKeyboard::Key::NavigationArrowLeft;
- case XKB_KEY_Right: return &InputDeviceKeyboard::Key::NavigationArrowRight;
- case XKB_KEY_Up: return &InputDeviceKeyboard::Key::NavigationArrowUp;
- case XKB_KEY_Delete: return &InputDeviceKeyboard::Key::NavigationDelete;
- case XKB_KEY_End: return &InputDeviceKeyboard::Key::NavigationEnd;
- case XKB_KEY_Home: return &InputDeviceKeyboard::Key::NavigationHome;
- case XKB_KEY_Insert: return &InputDeviceKeyboard::Key::NavigationInsert;
- case XKB_KEY_Page_Down: return &InputDeviceKeyboard::Key::NavigationPageDown;
- case XKB_KEY_Page_Up: return &InputDeviceKeyboard::Key::NavigationPageUp;
- case XKB_KEY_Num_Lock: return &InputDeviceKeyboard::Key::NumLock;
- case XKB_KEY_KP_0: return &InputDeviceKeyboard::Key::NumPad0;
- case XKB_KEY_KP_1: return &InputDeviceKeyboard::Key::NumPad1;
- case XKB_KEY_KP_2: return &InputDeviceKeyboard::Key::NumPad2;
- case XKB_KEY_KP_3: return &InputDeviceKeyboard::Key::NumPad3;
- case XKB_KEY_KP_4: return &InputDeviceKeyboard::Key::NumPad4;
- case XKB_KEY_KP_5: return &InputDeviceKeyboard::Key::NumPad5;
- case XKB_KEY_KP_6: return &InputDeviceKeyboard::Key::NumPad6;
- case XKB_KEY_KP_7: return &InputDeviceKeyboard::Key::NumPad7;
- case XKB_KEY_KP_8: return &InputDeviceKeyboard::Key::NumPad8;
- case XKB_KEY_KP_9: return &InputDeviceKeyboard::Key::NumPad9;
- case XKB_KEY_KP_Add: return &InputDeviceKeyboard::Key::NumPadAdd;
- case XKB_KEY_KP_Decimal: return &InputDeviceKeyboard::Key::NumPadDecimal;
- case XKB_KEY_KP_Divide: return &InputDeviceKeyboard::Key::NumPadDivide;
- case XKB_KEY_KP_Enter: return &InputDeviceKeyboard::Key::NumPadEnter;
- case XKB_KEY_KP_Multiply: return &InputDeviceKeyboard::Key::NumPadMultiply;
- case XKB_KEY_KP_Subtract: return &InputDeviceKeyboard::Key::NumPadSubtract;
- case XKB_KEY_apostrophe: return &InputDeviceKeyboard::Key::PunctuationApostrophe;
- case XKB_KEY_backslash: return &InputDeviceKeyboard::Key::PunctuationBackslash;
- case XKB_KEY_bracketleft: return &InputDeviceKeyboard::Key::PunctuationBracketL;
- case XKB_KEY_bracketright: return &InputDeviceKeyboard::Key::PunctuationBracketR;
- case XKB_KEY_comma: return &InputDeviceKeyboard::Key::PunctuationComma;
- case XKB_KEY_equal: return &InputDeviceKeyboard::Key::PunctuationEquals;
- case XKB_KEY_hyphen: return &InputDeviceKeyboard::Key::PunctuationHyphen;
- case XKB_KEY_period: return &InputDeviceKeyboard::Key::PunctuationPeriod;
- case XKB_KEY_semicolon: return &InputDeviceKeyboard::Key::PunctuationSemicolon;
- case XKB_KEY_slash: return &InputDeviceKeyboard::Key::PunctuationSlash;
- case XKB_KEY_grave:
- case XKB_KEY_asciitilde: return &InputDeviceKeyboard::Key::PunctuationTilde;
- case XKB_KEY_ISO_Group_Shift: return &InputDeviceKeyboard::Key::SupplementaryISO;
- case XKB_KEY_Pause: return &InputDeviceKeyboard::Key::WindowsSystemPause;
- case XKB_KEY_Print: return &InputDeviceKeyboard::Key::WindowsSystemPrint;
- case XKB_KEY_Scroll_Lock: return &InputDeviceKeyboard::Key::WindowsSystemScrollLock;
- default: return nullptr;
- }
- }
-
- template
- using DeleterForFreeFn = AZStd::integral_constant;
-
- AZStd::unique_ptr> m_xkbContext;
- AZStd::unique_ptr> m_xkbKeymap;
- AZStd::unique_ptr> m_xkbState;
- int m_coreDeviceId{-1};
- bool m_initialized{false};
- };
-
- InputDeviceKeyboard::Implementation* InputDeviceKeyboard::Implementation::Create(InputDeviceKeyboard& inputDevice)
- {
- return aznew InputDeviceKeyboardXcb(inputDevice);
- }
-} // 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 2950f8dcfc..ba3e761974 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp
+++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp
@@ -6,14 +6,16 @@
*
*/
-#include "NativeWindow_Linux_xcb.h"
+#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
+#include
+#endif
namespace AzFramework
{
NativeWindow::Implementation* NativeWindow::Implementation::Create()
{
#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
- return aznew NativeWindowImpl_Linux_xcb();
+ return aznew XcbNativeWindow();
#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND
#error "Linux Window Manager Wayland not supported."
return nullptr;
@@ -22,5 +24,4 @@ namespace AzFramework
return nullptr;
#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
}
-
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake b/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake
index 5c8ca8392f..b08c3b310d 100644
--- a/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake
+++ b/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake
@@ -10,6 +10,14 @@
# Only 'xcb' and 'wayland' are recognized
if (${PAL_TRAIT_LINUX_WINDOW_MANAGER} STREQUAL "xcb")
+ set(LY_COMPILE_DEFINITIONS PUBLIC PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB)
+ set(LY_INCLUDE_DIRECTORIES
+ PUBLIC
+ Platform/Common/Xcb
+ )
+ set(LY_FILES_CMAKE
+ Platform/Common/Xcb/azframework_xcb_files.cmake
+ )
set(LY_BUILD_DEPENDENCIES
PRIVATE
3rdParty::X11::xcb
@@ -18,8 +26,6 @@ if (${PAL_TRAIT_LINUX_WINDOW_MANAGER} STREQUAL "xcb")
3rdParty::X11::xkbcommon_X11
)
- set(LY_COMPILE_DEFINITIONS PUBLIC PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB)
-
elseif(PAL_TRAIT_LINUX_WINDOW_MANAGER STREQUAL "wayland")
set(LY_COMPILE_DEFINITIONS PUBLIC PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND)
diff --git a/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake b/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake
index 93767322b2..4f06aa5c57 100644
--- a/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake
+++ b/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake
@@ -12,8 +12,6 @@ set(FILES
AzFramework/API/ApplicationAPI_Platform.h
AzFramework/API/ApplicationAPI_Linux.h
AzFramework/Application/Application_Linux.cpp
- AzFramework/Application/Application_Linux_xcb.h
- AzFramework/Application/Application_Linux_xcb.cpp
AzFramework/Asset/AssetSystemComponentHelper_Linux.cpp
AzFramework/Process/ProcessWatcher_Linux.cpp
AzFramework/Process/ProcessCommon.h
@@ -22,10 +20,8 @@ set(FILES
../Common/Unimplemented/AzFramework/StreamingInstall/StreamingInstall_Unimplemented.cpp
../Common/Default/AzFramework/TargetManagement/TargetManagementComponent_Default.cpp
AzFramework/Windowing/NativeWindow_Linux.cpp
- AzFramework/Windowing/NativeWindow_Linux_xcb.h
- AzFramework/Windowing/NativeWindow_Linux_xcb.cpp
../Common/Unimplemented/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad_Unimplemented.cpp
- AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_xcb.cpp
+ AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Linux.cpp
../Common/Unimplemented/AzFramework/Input/Devices/Motion/InputDeviceMotion_Unimplemented.cpp
../Common/Unimplemented/AzFramework/Input/Devices/Mouse/InputDeviceMouse_Unimplemented.cpp
../Common/Unimplemented/AzFramework/Input/Devices/Touch/InputDeviceTouch_Unimplemented.cpp
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp
index 469a235b9f..ec709aef8a 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp
@@ -138,7 +138,13 @@ namespace AzToolsFramework
m_indexMap[row] = index;
m_rowMap[index] = row;
++row;
- ++m_displayedItemsCounter;
+
+ // We only want to increase the displayed counter if it is a parent (Source)
+ // so we don't cut children entries.
+ if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source)
+ {
+ ++m_displayedItemsCounter;
+ }
}
if (model->hasChildren(index))
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp
index 76b634b51e..966cd5a43a 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp
@@ -151,6 +151,10 @@ namespace AzToolsFramework
m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::ClearTypeFilter, m_ui->m_searchWidget,
&SearchWidget::ClearTypeFilter);
+ connect(
+ this, &AssetPickerDialog::SizeChangedSignal, m_ui->m_assetBrowserTableViewWidget,
+ &AssetBrowserTableView::UpdateSizeSlot);
+
m_ui->m_assetBrowserTableViewWidget->SetName("AssetBrowserTableView_main");
m_tableModel->UpdateTableModelMaps();
}
@@ -206,6 +210,12 @@ namespace AzToolsFramework
}
}
+ void AssetPickerDialog::resizeEvent(QResizeEvent* resizeEvent)
+ {
+ emit SizeChangedSignal(m_ui->verticalLayout_4->geometry().width());
+ QDialog::resizeEvent(resizeEvent);
+ }
+
void AssetPickerDialog::keyPressEvent(QKeyEvent* e)
{
// Until search widget is revised, Return key should not close the dialog,
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h
index bab265c134..f8ec6077ce 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h
@@ -46,6 +46,9 @@ namespace AzToolsFramework
explicit AssetPickerDialog(AssetSelectionModel& selection, QWidget* parent = nullptr);
virtual ~AssetPickerDialog();
+ Q_SIGNALS:
+ void SizeChangedSignal(int newWidth);
+
protected:
//////////////////////////////////////////////////////////////////////////
// QDialog
@@ -53,6 +56,7 @@ namespace AzToolsFramework
void accept() override;
void reject() override;
void keyPressEvent(QKeyEvent* e) override;
+ void resizeEvent(QResizeEvent* resizeEvent) override;
private Q_SLOTS:
void DoubleClickedSlot(const QModelIndex& index);
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui
index b11ffb3990..df7d27d3c8 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui
@@ -117,6 +117,9 @@
0
+ -
+
+
-
@@ -142,9 +145,6 @@
- -
-
-
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp
index 37091c11e2..feab9a9e5a 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp
@@ -20,29 +20,33 @@ AZ_PUSH_DISABLE_WARNING(
#include
#include
#include
-
+#include
#include
AZ_POP_DISABLE_WARNING
namespace AzToolsFramework
{
namespace AssetBrowser
{
+ const float MinHeaderResizeProportion = .25f;
+ const float MaxHeaderResizeProportion = .75f;
+ const float DefaultHeaderResizeProportion = .5f;
+
AssetBrowserTableView::AssetBrowserTableView(QWidget* parent)
: AzQtComponents::TableView(parent)
- , m_delegate(new EntryDelegate(this))
+ , m_delegate(new SearchEntryDelegate(this))
{
- setSortingEnabled(true);
+ setSortingEnabled(false);
setItemDelegate(m_delegate);
setRootIsDecorated(false);
//Styling the header aligning text to the left and using a bold font.
header()->setDefaultAlignment(Qt::AlignLeft);
- header()->setStyleSheet("QHeaderView { font-weight: bold; }");
+ header()->setStyleSheet("QHeaderView { font-weight: bold; };");
+
setContextMenuPolicy(Qt::CustomContextMenu);
setMouseTracking(true);
- setSortingEnabled(false);
setSelectionMode(QAbstractItemView::SingleSelection);
connect(this, &AzQtComponents::TableView::customContextMenuRequested, this, &AssetBrowserTableView::OnContextMenu);
@@ -65,8 +69,12 @@ namespace AzToolsFramework
AzQtComponents::TableView::setModel(model);
connect(m_tableModel, &AssetBrowserTableModel::layoutChanged, this, &AssetBrowserTableView::layoutChangedSlot);
- header()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch);
- header()->setSectionResizeMode(1, QHeaderView::ResizeMode::Stretch);
+ header()->setStretchLastSection(true);
+ header()->setSectionResizeMode(0, QHeaderView::ResizeMode::Interactive);
+ header()->setSectionResizeMode(1, QHeaderView::ResizeMode::Interactive);
+ UpdateSizeSlot(parentWidget()->width());
+ header()->setSortIndicatorShown(false);
+ header()->setSectionsClickable(false);
}
void AssetBrowserTableView::SetName(const QString& name)
@@ -146,8 +154,17 @@ namespace AzToolsFramework
void AssetBrowserTableView::OnAssetBrowserComponentReady()
{
+ UpdateSizeSlot(parentWidget()->width());
}
+ void AssetBrowserTableView::UpdateSizeSlot(int newWidth)
+ {
+ setColumnWidth(0, aznumeric_cast(newWidth * DefaultHeaderResizeProportion));
+ header()->setMinimumSectionSize(aznumeric_cast(newWidth * MinHeaderResizeProportion));
+ header()->setMaximumSectionSize(aznumeric_cast(newWidth * MaxHeaderResizeProportion));
+ }
+
+
void AssetBrowserTableView::OnContextMenu([[maybe_unused]] const QPoint& point)
{
const auto& selectedAssets = GetSelectedAssets();
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h
index 94e9bdc4e4..b93500ba37 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h
@@ -26,7 +26,7 @@ namespace AzToolsFramework
class AssetBrowserEntry;
class AssetBrowserTableModel;
class AssetBrowserFilterModel;
- class EntryDelegate;
+ class SearchEntryDelegate;
class AssetBrowserTableView //! Table view that displays the asset browser entries in a list.
: public AzQtComponents::TableView
@@ -59,17 +59,19 @@ namespace AzToolsFramework
void ClearStringFilter();
void ClearTypeFilter();
+ public Q_SLOTS:
+ void UpdateSizeSlot(int newWidth);
+
protected Q_SLOTS:
void selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) override;
void rowsAboutToBeRemoved(const QModelIndex& parent, int start, int end) override;
void layoutChangedSlot(const QList &parents = QList(),
QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
-
private:
QString m_name;
- QPointer m_tableModel = nullptr;
- QPointer m_sourceFilterModel = nullptr;
- EntryDelegate* m_delegate = nullptr;
+ QPointer m_tableModel;
+ QPointer m_sourceFilterModel;
+ SearchEntryDelegate* m_delegate = nullptr;
private Q_SLOTS:
void OnContextMenu(const QPoint& point);
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp
index 29324c612c..755c59b55b 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp
@@ -11,12 +11,13 @@
#include
#include
#include
-
+#include
#include
#include
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // 4251: class 'QScopedPointer' needs to have dll-interface to be used by clients of class 'QBrush'
// 4800: 'uint': forcing value to bool 'true' or 'false' (performance warning)
+#include
#include
AZ_POP_DISABLE_WARNING
@@ -24,8 +25,13 @@ namespace AzToolsFramework
{
namespace AssetBrowser
{
- const int ENTRY_SPACING_LEFT_PIXELS = 8;
- const int ENTRY_ICON_MARGIN_LEFT_PIXELS = 2;
+ static constexpr const char* TreeIconPathFirst = "Assets/Editor/Icons/AssetBrowser/TreeBranch_First.svg";
+ static constexpr const char* TreeIconPathMiddle = "Assets/Editor/Icons/AssetBrowser/TreeBranch_Middle.svg";
+ static constexpr const char* TreeIconPathLast = "Assets/Editor/Icons/AssetBrowser/TreeBranch_Last.svg";
+ static constexpr const char* TreeIconPathOneChild = "Assets/Editor/Icons/AssetBrowser/TreeBranch_OneChild.svg";
+
+ const int EntrySpacingLeftPixels = 8;
+ const int EntryIconMarginLeftPixels = 2;
EntryDelegate::EntryDelegate(QWidget* parent)
: QStyledItemDelegate(parent)
@@ -62,7 +68,7 @@ namespace AzToolsFramework
// Draw main entry thumbnail.
QRect remainingRect(option.rect);
- remainingRect.adjust(ENTRY_ICON_MARGIN_LEFT_PIXELS, 0, 0, 0); // bump it rightwards to give some margin to the icon.
+ remainingRect.adjust(EntryIconMarginLeftPixels, 0, 0, 0); // bump it rightwards to give some margin to the icon.
QSize iconSize(m_iconSize, m_iconSize);
// Note that the thumbnail might actually be smaller than the row if theres a lot of padding or font size
@@ -89,7 +95,7 @@ namespace AzToolsFramework
}
remainingRect.adjust(thumbX, 0, 0, 0); // bump it to the right by the size of the thumbnail
- remainingRect.adjust(ENTRY_SPACING_LEFT_PIXELS, 0, 0, 0); // bump it to the right by the spacing.
+ remainingRect.adjust(EntrySpacingLeftPixels, 0, 0, 0); // bump it to the right by the spacing.
}
QString displayString = index.column() == aznumeric_cast(AssetBrowserEntry::Column::Name)
? qvariant_cast(entry->data(aznumeric_cast(AssetBrowserEntry::Column::Name)))
@@ -148,7 +154,162 @@ namespace AzToolsFramework
return m_iconSize;
}
- } // namespace Thumbnailer
+ SearchEntryDelegate::SearchEntryDelegate(QWidget* parent)
+ : EntryDelegate(parent)
+ {
+ LoadBranchPixMaps();
+ }
+
+ void SearchEntryDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
+ {
+ auto data = index.data(AssetBrowserModel::Roles::EntryRole);
+ if (data.canConvert())
+ {
+ bool isEnabled = (option.state & QStyle::State_Enabled) != 0;
+ bool isSelected = (option.state & QStyle::State_Selected) != 0;
+
+ QStyle* style = option.widget ? option.widget->style() : QApplication::style();
+
+ // draw the background
+ style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, option.widget);
+
+ // Draw main entry thumbnail.
+ QRect remainingRect(option.rect);
+
+ QSize iconSize(m_iconSize, m_iconSize);
+ // Note that the thumbnail might actually be smaller than the row if theres a lot of padding or font size
+ // so it needs to center vertically with padding in that case:
+ QPoint iconTopLeft;
+ QPoint branchIconTopLeft = QPoint();
+
+ auto entry = qvariant_cast(data);
+ auto sourceEntry = azrtti_cast(entry);
+
+ //If it is a SourceEntry or it is not the column name we don't want to add space for the branch Icon
+ if (sourceEntry || index.column() != aznumeric_cast(AssetBrowserEntry::Column::Name))
+ {
+ remainingRect.adjust(EntryIconMarginLeftPixels, 0, 0, 0); // bump it rightwards to give some margin to the icon.
+ iconTopLeft = QPoint(remainingRect.x(), remainingRect.y() + (remainingRect.height() / 2) - (m_iconSize / 2));
+ }
+ else
+ {
+ remainingRect.adjust(EntryIconMarginLeftPixels + m_iconSize, 0, 0, 0); // bump it rightwards to give some margin to the icon.
+ iconTopLeft = QPoint(remainingRect.x() / 2 + m_iconSize, remainingRect.y() + (remainingRect.height() / 2) - (m_iconSize / 2));
+ branchIconTopLeft = QPoint((remainingRect.x() / 2) - 2, remainingRect.y() + (remainingRect.height() / 2) - (m_iconSize / 2));
+ }
+
+ QPalette actualPalette(option.palette);
+
+ if (index.column() == aznumeric_cast(AssetBrowserEntry::Column::Name))
+ {
+ int thumbX = DrawThumbnail(painter, iconTopLeft, iconSize, entry->GetThumbnailKey());
+ if (sourceEntry)
+ {
+ if (m_showSourceControl)
+ {
+ DrawThumbnail(painter, iconTopLeft, iconSize, sourceEntry->GetSourceControlThumbnailKey());
+ }
+ // sources with no children should be greyed out.
+ if (sourceEntry->GetChildCount() == 0)
+ {
+ isEnabled = false; // draw in disabled style.
+ actualPalette.setCurrentColorGroup(QPalette::Disabled);
+ }
+ }
+ else
+ {
+ //Get the indexes above and below our entry to see what type are they.
+ QAbstractItemView* view = qobject_cast(option.styleObject);
+ const QAbstractItemModel* viewModel = view->model();
+
+ const QModelIndex indexBelow = viewModel->index(index.row() + 1, index.column());
+ const QModelIndex indexAbove = viewModel->index(index.row() - 1, index.column());
+
+ auto aboveEntry = qvariant_cast(indexBelow.data(AssetBrowserModel::Roles::EntryRole));
+ auto belowEntry = qvariant_cast(indexAbove.data(AssetBrowserModel::Roles::EntryRole));
+
+ auto aboveSourceEntry = azrtti_cast(aboveEntry);
+ auto belowSourceEntry = azrtti_cast(belowEntry);
+
+ // if current index is the last entry in the view
+ // or the index above it is a Source Entry and
+ // the index below is invalid or is valid but it is also a source entry
+ // then the current index is the only child.
+ if (index.row() == viewModel->rowCount() - 1 ||
+ (indexBelow.isValid() && aboveSourceEntry &&
+ (!indexAbove.isValid() || (indexAbove.isValid() && belowSourceEntry))))
+ {
+ DrawBranchPixMap(EntryBranchType::OneChild, painter, branchIconTopLeft, iconSize); // Draw One Child Icon
+ }
+ else if (indexBelow.isValid() && aboveSourceEntry) // The index above is a source entry
+ {
+ DrawBranchPixMap(EntryBranchType::Last, painter, branchIconTopLeft, iconSize); // Draw First child Icon
+ }
+ else if (indexAbove.isValid() && belowSourceEntry) // The index below is a source entry
+ {
+ DrawBranchPixMap(EntryBranchType::First, painter, branchIconTopLeft, iconSize); // Draw Last Child Icon
+ }
+ else //the index above and below are also child entries
+ {
+ DrawBranchPixMap(EntryBranchType::Middle, painter, branchIconTopLeft, iconSize); // Draw Default child Icon.
+ }
+ }
+
+ remainingRect.adjust(thumbX, 0, 0, 0); // bump it to the right by the size of the thumbnail
+ remainingRect.adjust(EntrySpacingLeftPixels, 0, 0, 0); // bump it to the right by the spacing.
+ }
+ QString displayString = index.column() == aznumeric_cast(AssetBrowserEntry::Column::Name)
+ ? qvariant_cast(entry->data(aznumeric_cast(AssetBrowserEntry::Column::Name)))
+ : qvariant_cast(entry->data(aznumeric_cast(AssetBrowserEntry::Column::Path)));
+
+ style->drawItemText(
+ painter, remainingRect, option.displayAlignment, actualPalette, isEnabled, displayString,
+ isSelected ? QPalette::HighlightedText : QPalette::Text);
+ }
+ }
+
+ void SearchEntryDelegate::LoadBranchPixMaps()
+ {
+ AZ::IO::BasicPath absoluteIconPath;
+ for (int branchType = EntryBranchType::First; branchType != EntryBranchType::Count; ++branchType)
+ {
+ QPixmap pixmap;
+ switch (branchType)
+ {
+ case AzToolsFramework::AssetBrowser::EntryBranchType::First:
+ absoluteIconPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / TreeIconPathFirst;
+ break;
+ case AzToolsFramework::AssetBrowser::EntryBranchType::Middle:
+ absoluteIconPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / TreeIconPathMiddle;
+ break;
+ case AzToolsFramework::AssetBrowser::EntryBranchType::Last:
+ absoluteIconPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / TreeIconPathLast;
+ break;
+ case AzToolsFramework::AssetBrowser::EntryBranchType::OneChild:
+ default:
+ absoluteIconPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / TreeIconPathOneChild;
+ break;
+ }
+ bool pixmapLoadedSuccess = pixmap.load(absoluteIconPath.c_str());
+ AZ_Assert(pixmapLoadedSuccess, "Error loading Branch Icons in SearchEntryDelegate");
+
+ m_branchIcons[static_cast(branchType)] = pixmap;
+
+ }
+ }
+
+ void SearchEntryDelegate::DrawBranchPixMap(
+ EntryBranchType branchType, QPainter* painter, const QPoint& point, const QSize& size) const
+ {
+ const QPixmap& pixmap = m_branchIcons[branchType];
+
+ pixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ const QSize sizeDelta = size - pixmap.size();
+ const QPoint pointDelta = QPoint(sizeDelta.width() / 2, sizeDelta.height() / 2);
+ painter->drawPixmap(point + pointDelta, pixmap);
+ }
+
+ } // namespace AssetBrowser
} // namespace AzToolsFramework
#include "AssetBrowser/Views/moc_EntryDelegate.cpp"
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h
index 643bedec7c..ac68c19248 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h
@@ -27,9 +27,19 @@ namespace AzToolsFramework
{
namespace AssetBrowser
{
+ //! Type of branch icon the delegate should paint.
+ enum EntryBranchType
+ {
+ First,
+ Middle,
+ Last,
+ OneChild,
+ Count
+ };
+
class AssetBrowserFilterModel;
- //! EntryDelegate draws a single item in AssetBrowser
+ //! EntryDelegate draws a single item in AssetBrowser.
class EntryDelegate
: public QStyledItemDelegate
{
@@ -52,5 +62,23 @@ namespace AzToolsFramework
//! Draw a thumbnail and return its width
int DrawThumbnail(QPainter* painter, const QPoint& point, const QSize& size, Thumbnailer::SharedThumbnailKey thumbnailKey) const;
};
+
+ //! SearchEntryDelegate draws a single item in AssetBrowserTableView.
+ class SearchEntryDelegate
+ : public EntryDelegate
+ {
+ Q_OBJECT
+ public:
+ explicit SearchEntryDelegate(QWidget* parent = nullptr);
+
+ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
+
+ private:
+ void LoadBranchPixMaps();
+ void DrawBranchPixMap(EntryBranchType branchType, QPainter* painter, const QPoint& point, const QSize& size) const;
+
+ private:
+ QMap m_branchIcons;
+ };
} // namespace AssetBrowser
} // namespace AzToolsFramework
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeInterface.h
index 6d3a7599de..a4b90f95b7 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeInterface.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeInterface.h
@@ -33,7 +33,7 @@ namespace AzToolsFramework
virtual AZ::EntityId GetFocusRoot() = 0;
//! Returns whether the entity id provided is part of the focused sub-tree.
- virtual bool IsInFocusSubTree(AZ::EntityId entityId) = 0;
+ virtual bool IsInFocusSubTree(AZ::EntityId entityId) const = 0;
};
} // namespace AzToolsFramework
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp
index e08191032d..e1c04fcb93 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.cpp
@@ -79,7 +79,7 @@ namespace AzToolsFramework
return m_focusRoot;
}
- bool FocusModeSystemComponent::IsInFocusSubTree(AZ::EntityId entityId)
+ bool FocusModeSystemComponent::IsInFocusSubTree(AZ::EntityId entityId) const
{
if (m_focusRoot == AZ::EntityId())
{
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h
index 697a4ff998..27ddebe1ed 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/FocusMode/FocusModeSystemComponent.h
@@ -42,7 +42,7 @@ namespace AzToolsFramework
void SetFocusRoot(AZ::EntityId entityId) override;
void ClearFocusRoot() override;
AZ::EntityId GetFocusRoot() override;
- bool IsInFocusSubTree(AZ::EntityId entityId) override;
+ bool IsInFocusSubTree(AZ::EntityId entityId) const override;
private:
AZ::EntityId m_focusRoot;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp
index 1867f346ec..d8c43ace9e 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp
@@ -71,6 +71,7 @@ namespace AzToolsFramework
}
m_uniformScaleManipulator->SetVisualOrientationOverride(QuaternionFromTransformNoScaling(localTransform));
+ m_uniformScaleManipulator->SetLocalPosition(localTransform.GetTranslation());
m_uniformScaleManipulator->SetLocalOrientation(AZ::Quaternion::CreateIdentity());
}
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp
index 049cab4a13..0efe310250 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp
@@ -13,14 +13,14 @@
namespace AzToolsFramework
{
- static const float s_surfaceManipulatorTransparency = 0.75f;
- static const float s_axisLength = 2.0f;
- static const float s_surfaceManipulatorRadius = 0.1f;
+ static const float SurfaceManipulatorTransparency = 0.75f;
+ static const float LinearManipulatorAxisLength = 2.0f;
+ static const float SurfaceManipulatorRadius = 0.1f;
- static const AZ::Color s_xAxisColor = AZ::Color(1.0f, 0.0f, 0.0f, 1.0f);
- static const AZ::Color s_yAxisColor = AZ::Color(0.0f, 1.0f, 0.0f, 1.0f);
- static const AZ::Color s_zAxisColor = AZ::Color(0.0f, 0.0f, 1.0f, 1.0f);
- static const AZ::Color s_surfaceManipulatorColor = AZ::Color(1.0f, 1.0f, 0.0f, 0.5f);
+ static const AZ::Color LinearManipulatorXAxisColor = AZ::Color(1.0f, 0.0f, 0.0f, 1.0f);
+ static const AZ::Color LinearManipulatorYAxisColor = AZ::Color(0.0f, 1.0f, 0.0f, 1.0f);
+ static const AZ::Color LinearManipulatorZAxisColor = AZ::Color(0.0f, 0.0f, 1.0f, 1.0f);
+ static const AZ::Color SurfaceManipulatorColor = AZ::Color(1.0f, 1.0f, 0.0f, 0.5f);
TranslationManipulators::TranslationManipulators(
const Dimensions dimensions, const AZ::Transform& worldFromLocal, const AZ::Vector3& nonUniformScale)
@@ -291,7 +291,7 @@ namespace AzToolsFramework
{
const AZ::Color color[2] = {
defaultColor,
- Vector3ToVector4(BaseManipulator::s_defaultMouseOverColor.GetAsVector3(), s_surfaceManipulatorTransparency)
+ Vector3ToVector4(BaseManipulator::s_defaultMouseOverColor.GetAsVector3(), SurfaceManipulatorTransparency)
};
return color[mouseOver];
@@ -325,15 +325,16 @@ namespace AzToolsFramework
void ConfigureTranslationManipulatorAppearance3d(TranslationManipulators* translationManipulators)
{
translationManipulators->SetAxes(AZ::Vector3::CreateAxisX(), AZ::Vector3::CreateAxisY(), AZ::Vector3::CreateAxisZ());
- translationManipulators->ConfigurePlanarView(s_xAxisColor, s_yAxisColor, s_zAxisColor);
- translationManipulators->ConfigureLinearView(s_axisLength, s_xAxisColor, s_yAxisColor, s_zAxisColor);
- translationManipulators->ConfigureSurfaceView(s_surfaceManipulatorRadius, s_surfaceManipulatorColor);
+ translationManipulators->ConfigurePlanarView(LinearManipulatorXAxisColor, LinearManipulatorYAxisColor, LinearManipulatorZAxisColor);
+ translationManipulators->ConfigureLinearView(
+ LinearManipulatorAxisLength, LinearManipulatorXAxisColor, LinearManipulatorYAxisColor, LinearManipulatorZAxisColor);
+ translationManipulators->ConfigureSurfaceView(SurfaceManipulatorRadius, SurfaceManipulatorColor);
}
void ConfigureTranslationManipulatorAppearance2d(TranslationManipulators* translationManipulators)
{
translationManipulators->SetAxes(AZ::Vector3::CreateAxisX(), AZ::Vector3::CreateAxisY());
- translationManipulators->ConfigurePlanarView(s_xAxisColor);
- translationManipulators->ConfigureLinearView(s_axisLength, s_xAxisColor, s_yAxisColor);
+ translationManipulators->ConfigurePlanarView(LinearManipulatorXAxisColor);
+ translationManipulators->ConfigureLinearView(LinearManipulatorAxisLength, LinearManipulatorXAxisColor, LinearManipulatorYAxisColor);
}
} // namespace AzToolsFramework
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp
index 2338c8892b..d69d0004cc 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp
@@ -35,7 +35,7 @@ namespace AzToolsFramework::Prefab
{
InstanceOptionalReference focusedInstance;
- if (entityId == AZ::EntityId())
+ if (!entityId.IsValid())
{
PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
AZ::Interface::Get();
@@ -83,7 +83,13 @@ namespace AzToolsFramework::Prefab
bool PrefabFocusHandler::IsOwningPrefabBeingFocused(AZ::EntityId entityId)
{
- if (entityId == AZ::EntityId())
+ if (!m_focusedInstance.has_value())
+ {
+ // PrefabFocusHandler has not been initialized yet.
+ return false;
+ }
+
+ if (!entityId.IsValid())
{
return false;
}
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss
index 15ff8b1b67..b3c5882334 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss
@@ -18,18 +18,19 @@ AzToolsFramework--EntityOutlinerWidget QTreeView
selection-background-color: transparent;
}
+
+/*
+ * Entity Outliner handles hover and selected state of items via code,
+ * so we need to override the AzQtComponents::Treeview style.
+ */
AzToolsFramework--EntityOutlinerWidget QTreeView::branch:hover
, AzToolsFramework--EntityOutlinerWidget QTreeView::item:hover
-{
- background: rgba(255, 255, 255, 30);
-}
-
-AzToolsFramework--EntityOutlinerWidget QTreeView::branch:selected
+, AzToolsFramework--EntityOutlinerWidget QTreeView::branch:selected
, AzToolsFramework--EntityOutlinerWidget QTreeView::item:selected
, AzToolsFramework--EntityOutlinerWidget QTreeView::branch:selected:active
, AzToolsFramework--EntityOutlinerWidget QTreeView::item:selected:active
{
- background: rgba(255, 255, 255, 45);
+ background: transparent;
}
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp
index d9f3ff8bb8..90f8e1d121 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp
@@ -44,6 +44,7 @@
#include
#include
#include