/*
* 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 MaterialEditor
{
MaterialEditorMainWindow::MaterialEditorMainWindow(const AZ::Crc32& toolId, QWidget* parent)
: Base(toolId, "MaterialEditorMainWindow", parent)
{
m_assetBrowser->GetSearchWidget()->SetFilterState("", AZ::RPI::StreamingImageAsset::Group, true);
m_assetBrowser->GetSearchWidget()->SetFilterState("", AZ::RPI::MaterialAsset::Group, true);
m_documentInspector = new AtomToolsFramework::AtomToolsDocumentInspector(m_toolId, this);
m_documentInspector->SetDocumentSettingsPrefix("/O3DE/Atom/MaterialEditor/DocumentInspector");
AddDockWidget("Inspector", m_documentInspector, Qt::RightDockWidgetArea);
// Set up the toolbar that controls the viewport settings
m_toolBar = new AtomToolsFramework::EntityPreviewViewportToolBar(m_toolId, this);
// Create the viewport widget that will be shared between all material editor documents
m_materialViewport = new AtomToolsFramework::EntityPreviewViewportWidget(m_toolId, this);
// Initialize the entity context that will be used to create all of the entities displayed in the viewport
auto entityContext = AZStd::make_shared();
entityContext->InitContext();
// Initialize the atom scene and pipeline that will bind to the viewport window to render entities and presets
auto viewportScene = AZStd::make_shared(
m_toolId, m_materialViewport, entityContext, "MaterialEditorViewportWidget", "passes/mainrenderpipeline.azasset");
// Viewport content will instantiate all of the entities that will be displayed and controlled by the viewport
auto viewportContent = AZStd::make_shared(m_toolId, m_materialViewport, entityContext);
// The input controller creates and binds input behaviors to control viewport objects
auto viewportController = AZStd::make_shared(m_toolId, m_materialViewport, viewportContent);
// Inject the entity context, scene, content, and controller into the viewport widget
m_materialViewport->Init(entityContext, viewportScene, viewportContent, viewportController);
// Register the toolbar in the viewport as the central widget, or main view of the material editor
centralWidget()->layout()->addWidget(m_toolBar);
centralWidget()->layout()->addWidget(m_materialViewport);
m_viewportSettingsInspector = new AtomToolsFramework::EntityPreviewViewportSettingsInspector(m_toolId, this);
AddDockWidget("Viewport Settings", m_viewportSettingsInspector, Qt::LeftDockWidgetArea);
SetDockWidgetVisible("Viewport Settings", false);
OnDocumentOpened(AZ::Uuid::CreateNull());
}
void MaterialEditorMainWindow::OnDocumentOpened(const AZ::Uuid& documentId)
{
Base::OnDocumentOpened(documentId);
m_documentInspector->SetDocumentId(documentId);
}
void MaterialEditorMainWindow::ResizeViewportRenderTarget(uint32_t width, uint32_t height)
{
QSize requestedViewportSize = QSize(width, height) / devicePixelRatioF();
QSize currentViewportSize = m_materialViewport->size();
QSize offset = requestedViewportSize - currentViewportSize;
QSize requestedWindowSize = size() + offset;
resize(requestedWindowSize);
AZ_Assert(
m_materialViewport->size() == requestedViewportSize,
"Resizing the window did not give the expected viewport size. Requested %d x %d but got %d x %d.",
requestedViewportSize.width(), requestedViewportSize.height(), m_materialViewport->size().width(),
m_materialViewport->size().height());
[[maybe_unused]] QSize newDeviceSize = m_materialViewport->size();
AZ_Warning(
"Material Editor", static_cast(newDeviceSize.width()) == width && static_cast(newDeviceSize.height()) == height,
"Resizing the window did not give the expected frame size. Requested %d x %d but got %d x %d.", width, height,
newDeviceSize.width(), newDeviceSize.height());
}
void MaterialEditorMainWindow::LockViewportRenderTargetSize(uint32_t width, uint32_t height)
{
m_materialViewport->LockRenderTargetSize(width, height);
}
void MaterialEditorMainWindow::UnlockViewportRenderTargetSize()
{
m_materialViewport->UnlockRenderTargetSize();
}
AZStd::string MaterialEditorMainWindow::GetHelpDialogText() const
{
return R"(
Camera Controls
LMB - rotate camera
RMB or Alt+LMB - orbit camera around target
MMB - pan camera on its xy plane
Alt+RMB or LMB+RMB - dolly camera on its z axis
Ctrl+LMB - rotate model
Shift+LMB - rotate environment
)";
}
} // namespace MaterialEditor
#include