Merge pull request #277 from aws-lumberyard-dev/nvsickle/MoreMainFixes
Cherry-pick several 1.0 viewport fixes to main
This commit is contained in:
@@ -118,6 +118,12 @@ namespace AZ
|
||||
//! Update View's SRG values and compile. This should only be called once per frame before execute command lists.
|
||||
void UpdateSrg();
|
||||
|
||||
using MatrixChangedEvent = AZ::Event<const AZ::Matrix4x4&>;
|
||||
//! Notifies consumers when the world to view matrix has changed.
|
||||
void ConnectWorldToViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler);
|
||||
//! Notifies consumers when the world to clip matrix has changed.
|
||||
void ConnectWorldToClipMatrixChangedHandler(MatrixChangedEvent::Handler& handler);
|
||||
|
||||
private:
|
||||
View() = delete;
|
||||
View(const AZ::Name& name, UsageFlags usage);
|
||||
@@ -182,6 +188,9 @@ namespace AZ
|
||||
// view class doesn't contain subroutines called at the end of each frame
|
||||
bool m_worldToClipMatrixChanged = true;
|
||||
bool m_worldToClipPrevMatrixNeedsUpdate = false;
|
||||
|
||||
MatrixChangedEvent m_onWorldToClipMatrixChange;
|
||||
MatrixChangedEvent m_onWorldToViewMatrixChange;
|
||||
};
|
||||
|
||||
AZ_DEFINE_ENUM_BITWISE_OPERATORS(View::UsageFlags);
|
||||
|
||||
@@ -125,7 +125,9 @@ namespace AZ
|
||||
AzFramework::WindowSize m_viewportSize;
|
||||
SizeChangedEvent m_sizeChangedEvent;
|
||||
MatrixChangedEvent m_viewMatrixChangedEvent;
|
||||
MatrixChangedEvent::Handler m_onViewMatrixChangedHandler;
|
||||
MatrixChangedEvent m_projectionMatrixChangedEvent;
|
||||
MatrixChangedEvent::Handler m_onProjectionMatrixChangedHandler;
|
||||
SceneChangedEvent m_sceneChangedEvent;
|
||||
ViewportContextManager* m_manager;
|
||||
RenderPipelinePtr m_currentPipeline;
|
||||
|
||||
@@ -104,6 +104,9 @@ namespace AZ
|
||||
m_worldToClipMatrix = m_viewToClipMatrix * m_worldToViewMatrix;
|
||||
m_worldToClipMatrixChanged = true;
|
||||
|
||||
m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix);
|
||||
m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix);
|
||||
|
||||
InvalidateSrg();
|
||||
}
|
||||
|
||||
@@ -132,6 +135,9 @@ namespace AZ
|
||||
m_clipToWorldMatrix = m_viewToWorldMatrix * m_clipToViewMatrix;
|
||||
m_worldToClipMatrixChanged = true;
|
||||
|
||||
m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix);
|
||||
m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix);
|
||||
|
||||
InvalidateSrg();
|
||||
}
|
||||
|
||||
@@ -166,6 +172,8 @@ namespace AZ
|
||||
m_unprojectionConstants.SetZ(float(-tanHalfFovX));
|
||||
m_unprojectionConstants.SetW(float(tanHalfFovY));
|
||||
|
||||
m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix);
|
||||
|
||||
InvalidateSrg();
|
||||
}
|
||||
|
||||
@@ -225,6 +233,16 @@ namespace AZ
|
||||
passWithDrawListTag->SortDrawList(drawList);
|
||||
}
|
||||
|
||||
void View::ConnectWorldToViewMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_onWorldToViewMatrixChange);
|
||||
}
|
||||
|
||||
void View::ConnectWorldToClipMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_onWorldToClipMatrixChange);
|
||||
}
|
||||
|
||||
// [GFX TODO] This function needs unit tests and might need to be reworked
|
||||
RHI::DrawItemSortKey View::GetSortKeyForPosition(const Vector3& positionInWorld) const
|
||||
{
|
||||
|
||||
@@ -34,6 +34,15 @@ namespace AZ
|
||||
&AzFramework::WindowRequestBus::Events::GetClientAreaSize);
|
||||
AzFramework::WindowNotificationBus::Handler::BusConnect(nativeWindow);
|
||||
|
||||
m_onProjectionMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix)
|
||||
{
|
||||
m_projectionMatrixChangedEvent.Signal(matrix);
|
||||
});
|
||||
m_onViewMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix)
|
||||
{
|
||||
m_projectionMatrixChangedEvent.Signal(matrix);
|
||||
});
|
||||
|
||||
SetRenderScene(renderScene);
|
||||
}
|
||||
|
||||
@@ -175,7 +184,6 @@ namespace AZ
|
||||
void ViewportContext::SetCameraProjectionMatrix(const AZ::Matrix4x4& matrix)
|
||||
{
|
||||
GetDefaultView()->SetViewToClipMatrix(matrix);
|
||||
m_projectionMatrixChangedEvent.Signal(matrix);
|
||||
}
|
||||
|
||||
AZ::Transform ViewportContext::GetCameraTransform() const
|
||||
@@ -192,18 +200,23 @@ namespace AZ
|
||||
{
|
||||
const auto view = GetDefaultView();
|
||||
view->SetCameraTransform(AZ::Matrix3x4::CreateFromTransform(transform.GetOrthogonalized()));
|
||||
m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix());
|
||||
}
|
||||
|
||||
void ViewportContext::SetDefaultView(ViewPtr view)
|
||||
{
|
||||
if (m_defaultView != view)
|
||||
{
|
||||
m_onProjectionMatrixChangedHandler.Disconnect();
|
||||
m_onViewMatrixChangedHandler.Disconnect();
|
||||
|
||||
m_defaultView = view;
|
||||
UpdatePipelineView();
|
||||
|
||||
m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix());
|
||||
m_projectionMatrixChangedEvent.Signal(view->GetViewToClipMatrix());
|
||||
|
||||
view->ConnectWorldToViewMatrixChangedHandler(m_onViewMatrixChangedHandler);
|
||||
view->ConnectWorldToClipMatrixChangedHandler(m_onProjectionMatrixChangedHandler);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-1
@@ -43,9 +43,16 @@ namespace AtomToolsFramework
|
||||
//! Creates a RenderViewportWidget.
|
||||
//! Requires the Atom RPI to be initialized in order
|
||||
//! to internally construct an RPI::ViewportContext.
|
||||
explicit RenderViewportWidget(AzFramework::ViewportId id = AzFramework::InvalidViewportId, QWidget* parent = nullptr);
|
||||
//! If initializeViewportContext is set to false, nothing will be displayed on-screen until InitiliazeViewportContext is called.
|
||||
explicit RenderViewportWidget(QWidget* parent = nullptr, bool shouldInitializeViewportContext = true);
|
||||
~RenderViewportWidget();
|
||||
|
||||
//! Initializes the underlying ViewportContext, if it hasn't already been.
|
||||
//! If id is specified, the target ViewportContext will be overridden.
|
||||
//! NOTE: ViewportContext IDs must be unique.
|
||||
//! Returns true if the ViewportContext is available
|
||||
//! (i.e. GetViewportContext will return a valid pointer).
|
||||
bool InitializeViewportContext(AzFramework::ViewportId id = AzFramework::InvalidViewportId);
|
||||
//! Gets the name associated with this viewport's ViewportContext.
|
||||
//! This context name can be used to adjust the current Camera
|
||||
//! independently of the underlying viewport.
|
||||
|
||||
@@ -31,12 +31,35 @@
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
RenderViewportWidget::RenderViewportWidget(AzFramework::ViewportId id, QWidget* parent)
|
||||
RenderViewportWidget::RenderViewportWidget(QWidget* parent, bool shouldInitializeViewportContext)
|
||||
: QWidget(parent)
|
||||
, AzFramework::InputChannelEventListener(AzFramework::InputChannelEventListener::GetPriorityDefault())
|
||||
{
|
||||
if (shouldInitializeViewportContext)
|
||||
{
|
||||
InitializeViewportContext();
|
||||
}
|
||||
|
||||
setUpdatesEnabled(false);
|
||||
setFocusPolicy(Qt::FocusPolicy::WheelFocus);
|
||||
setMouseTracking(true);
|
||||
}
|
||||
|
||||
bool RenderViewportWidget::InitializeViewportContext(AzFramework::ViewportId id)
|
||||
{
|
||||
if (m_viewportContext != nullptr)
|
||||
{
|
||||
AZ_Assert(id == AzFramework::InvalidViewportId || m_viewportContext->GetId() == id, "Attempted to reinitialize RenderViewportWidget with a different ID");
|
||||
return true;
|
||||
}
|
||||
|
||||
auto viewportContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get();
|
||||
AZ_Assert(viewportContextManager, "Attempted to construct RenderViewportWidget without ViewportContextManager");
|
||||
AZ_Assert(viewportContextManager, "Attempted to initialize RenderViewportWidget without ViewportContextManager");
|
||||
|
||||
if (viewportContextManager == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Before we do anything else, we must create a ViewportContext which will give us a ViewportId if we didn't manually specify one.
|
||||
AZ::RPI::ViewportContextRequestsInterface::CreationParameters params;
|
||||
@@ -46,6 +69,11 @@ namespace AtomToolsFramework
|
||||
AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle);
|
||||
m_viewportContext = viewportContextManager->CreateViewportContext(AZ::Name(), params);
|
||||
|
||||
if (m_viewportContext == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SetControllerList(AZStd::make_shared<AzFramework::ViewportControllerList>());
|
||||
|
||||
AZ::Name cameraName = AZ::Name(AZStd::string::format("Viewport %i Default Camera", m_viewportContext->GetId()));
|
||||
@@ -58,9 +86,7 @@ namespace AtomToolsFramework
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle);
|
||||
|
||||
setUpdatesEnabled(false);
|
||||
setFocusPolicy(Qt::FocusPolicy::WheelFocus);
|
||||
setMouseTracking(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
RenderViewportWidget::~RenderViewportWidget()
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace MaterialEditor
|
||||
{
|
||||
|
||||
MaterialViewportWidget::MaterialViewportWidget(QWidget* parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(parent)
|
||||
, m_ui(new Ui::MaterialViewportWidget)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
Reference in New Issue
Block a user