3
0

MaterialEditorMainWindow.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Window/MaterialEditorMainWindow.h>
  9. #include <Window/MaterialEditorViewportContent.h>
  10. #include <QApplication>
  11. #include <QMessageBox>
  12. #include <QWindow>
  13. namespace MaterialEditor
  14. {
  15. MaterialEditorMainWindow::MaterialEditorMainWindow(const AZ::Crc32& toolId, QWidget* parent)
  16. : Base(toolId, "MaterialEditorMainWindow", parent)
  17. {
  18. m_assetBrowser->GetSearchWidget()->SetFilterState("", AZ::RPI::StreamingImageAsset::Group, true);
  19. m_assetBrowser->GetSearchWidget()->SetFilterState("", AZ::RPI::MaterialAsset::Group, true);
  20. m_documentInspector = new AtomToolsFramework::AtomToolsDocumentInspector(m_toolId, this);
  21. m_documentInspector->SetDocumentSettingsPrefix("/O3DE/Atom/MaterialEditor/DocumentInspector");
  22. AddDockWidget("Inspector", m_documentInspector, Qt::RightDockWidgetArea);
  23. // Set up the toolbar that controls the viewport settings
  24. m_toolBar = new AtomToolsFramework::EntityPreviewViewportToolBar(m_toolId, this);
  25. // Create the viewport widget that will be shared between all material editor documents
  26. m_materialViewport = new AtomToolsFramework::EntityPreviewViewportWidget(m_toolId, this);
  27. // Initialize the entity context that will be used to create all of the entities displayed in the viewport
  28. auto entityContext = AZStd::make_shared<AzFramework::EntityContext>();
  29. entityContext->InitContext();
  30. // Initialize the atom scene and pipeline that will bind to the viewport window to render entities and presets
  31. auto viewportScene = AZStd::make_shared<AtomToolsFramework::EntityPreviewViewportScene>(
  32. m_toolId, m_materialViewport, entityContext, "MaterialEditorViewportWidget", "passes/mainrenderpipeline.azasset");
  33. // Viewport content will instantiate all of the entities that will be displayed and controlled by the viewport
  34. auto viewportContent = AZStd::make_shared<MaterialEditorViewportContent>(m_toolId, m_materialViewport, entityContext);
  35. // The input controller creates and binds input behaviors to control viewport objects
  36. auto viewportController = AZStd::make_shared<AtomToolsFramework::EntityPreviewViewportInputController>(m_toolId, m_materialViewport, viewportContent);
  37. // Inject the entity context, scene, content, and controller into the viewport widget
  38. m_materialViewport->Init(entityContext, viewportScene, viewportContent, viewportController);
  39. // Register the toolbar in the viewport as the central widget, or main view of the material editor
  40. centralWidget()->layout()->addWidget(m_toolBar);
  41. centralWidget()->layout()->addWidget(m_materialViewport);
  42. m_viewportSettingsInspector = new AtomToolsFramework::EntityPreviewViewportSettingsInspector(m_toolId, this);
  43. AddDockWidget("Viewport Settings", m_viewportSettingsInspector, Qt::LeftDockWidgetArea);
  44. SetDockWidgetVisible("Viewport Settings", false);
  45. OnDocumentOpened(AZ::Uuid::CreateNull());
  46. }
  47. void MaterialEditorMainWindow::OnDocumentOpened(const AZ::Uuid& documentId)
  48. {
  49. Base::OnDocumentOpened(documentId);
  50. m_documentInspector->SetDocumentId(documentId);
  51. }
  52. void MaterialEditorMainWindow::ResizeViewportRenderTarget(uint32_t width, uint32_t height)
  53. {
  54. QSize requestedViewportSize = QSize(width, height) / devicePixelRatioF();
  55. QSize currentViewportSize = m_materialViewport->size();
  56. QSize offset = requestedViewportSize - currentViewportSize;
  57. QSize requestedWindowSize = size() + offset;
  58. resize(requestedWindowSize);
  59. AZ_Assert(
  60. m_materialViewport->size() == requestedViewportSize,
  61. "Resizing the window did not give the expected viewport size. Requested %d x %d but got %d x %d.",
  62. requestedViewportSize.width(), requestedViewportSize.height(), m_materialViewport->size().width(),
  63. m_materialViewport->size().height());
  64. [[maybe_unused]] QSize newDeviceSize = m_materialViewport->size();
  65. AZ_Warning(
  66. "Material Editor", static_cast<uint32_t>(newDeviceSize.width()) == width && static_cast<uint32_t>(newDeviceSize.height()) == height,
  67. "Resizing the window did not give the expected frame size. Requested %d x %d but got %d x %d.", width, height,
  68. newDeviceSize.width(), newDeviceSize.height());
  69. }
  70. void MaterialEditorMainWindow::LockViewportRenderTargetSize(uint32_t width, uint32_t height)
  71. {
  72. m_materialViewport->LockRenderTargetSize(width, height);
  73. }
  74. void MaterialEditorMainWindow::UnlockViewportRenderTargetSize()
  75. {
  76. m_materialViewport->UnlockRenderTargetSize();
  77. }
  78. AZStd::string MaterialEditorMainWindow::GetHelpUrl() const
  79. {
  80. return "https://docs.o3de.org/docs/atom-guide/look-dev/tools/material-editor/";
  81. }
  82. } // namespace MaterialEditor
  83. #include <Window/moc_MaterialEditorMainWindow.cpp>