PassCanvasMainWindow.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 <AtomToolsFramework/SettingsDialog/SettingsDialog.h>
  9. #include <AzCore/IO/FileIO.h>
  10. #include <AzQtComponents/Components/StyleManager.h>
  11. #include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
  12. #include <Window/PassCanvasMainWindow.h>
  13. #include <Window/PassCanvasViewportContent.h>
  14. #include <QMessageBox>
  15. namespace PassCanvas
  16. {
  17. PassCanvasMainWindow::PassCanvasMainWindow(
  18. const AZ::Crc32& toolId, AtomToolsFramework::GraphViewSettingsPtr graphViewSettingsPtr, QWidget* parent)
  19. : Base(toolId, "PassCanvasMainWindow", parent)
  20. , m_graphViewSettingsPtr(graphViewSettingsPtr)
  21. , m_styleManager(toolId, graphViewSettingsPtr->m_styleManagerPath)
  22. {
  23. m_assetBrowser->GetSearchWidget()->SetFilterState("", AZ::RPI::StreamingImageAsset::Group, true);
  24. m_assetBrowser->GetSearchWidget()->SetFilterState("", AZ::RPI::PassAsset::Group, true);
  25. m_documentInspector = new AtomToolsFramework::AtomToolsDocumentInspector(m_toolId, this);
  26. m_documentInspector->SetDocumentSettingsPrefix("/O3DE/Atom/PassCanvas/DocumentInspector");
  27. AddDockWidget("Inspector", m_documentInspector, Qt::RightDockWidgetArea);
  28. // Set up the toolbar that controls the viewport settings
  29. m_toolBar = new AtomToolsFramework::EntityPreviewViewportToolBar(m_toolId, this);
  30. // Create the dockable viewport widget that will be shared between all Pass Canvas documents
  31. m_passViewport = new AtomToolsFramework::EntityPreviewViewportWidget(m_toolId, this);
  32. // Initialize the entity context that will be used to create all of the entities displayed in the viewport
  33. auto entityContext = AZStd::make_shared<AzFramework::EntityContext>();
  34. entityContext->InitContext();
  35. // Initialize the atom scene and pipeline that will bind to the viewport window to render entities and presets
  36. auto viewportScene = AZStd::make_shared<AtomToolsFramework::EntityPreviewViewportScene>(
  37. m_toolId, m_passViewport, entityContext, "PassCanvasViewportWidget", "passes/mainrenderpipeline.azasset");
  38. // Viewport content will instantiate all of the entities that will be displayed and controlled by the viewport
  39. auto viewportContent = AZStd::make_shared<PassCanvasViewportContent>(m_toolId, m_passViewport, entityContext);
  40. // The input controller creates and binds input behaviors to control viewport objects
  41. auto viewportController = AZStd::make_shared<AtomToolsFramework::EntityPreviewViewportInputController>(m_toolId, m_passViewport, viewportContent);
  42. // Inject the entity context, scene, content, and controller into the viewport widget
  43. m_passViewport->Init(entityContext, viewportScene, viewportContent, viewportController);
  44. // Combine the shared toolbar in viewport into stacked widget that will be docked as a single view
  45. auto viewPortAndToolbar = new QWidget(this);
  46. viewPortAndToolbar->setLayout(new QVBoxLayout(viewPortAndToolbar));
  47. viewPortAndToolbar->layout()->setContentsMargins(0, 0, 0, 0);
  48. viewPortAndToolbar->layout()->setMargin(0);
  49. viewPortAndToolbar->layout()->setSpacing(0);
  50. viewPortAndToolbar->layout()->addWidget(m_toolBar);
  51. viewPortAndToolbar->layout()->addWidget(m_passViewport);
  52. AddDockWidget("Viewport", viewPortAndToolbar, Qt::BottomDockWidgetArea);
  53. m_viewportSettingsInspector = new AtomToolsFramework::EntityPreviewViewportSettingsInspector(m_toolId, this);
  54. AddDockWidget("Viewport Settings", m_viewportSettingsInspector, Qt::LeftDockWidgetArea);
  55. SetDockWidgetVisible("Viewport Settings", false);
  56. m_bookmarkDockWidget = aznew GraphCanvas::BookmarkDockWidget(m_toolId, this);
  57. AddDockWidget("Bookmarks", m_bookmarkDockWidget, Qt::BottomDockWidgetArea);
  58. SetDockWidgetVisible("Bookmarks", false);
  59. AddDockWidget("MiniMap", aznew GraphCanvas::MiniMapDockWidget(m_toolId, this), Qt::BottomDockWidgetArea);
  60. SetDockWidgetVisible("MiniMap", false);
  61. GraphCanvas::NodePaletteConfig nodePaletteConfig;
  62. nodePaletteConfig.m_rootTreeItem = m_graphViewSettingsPtr->m_createNodeTreeItemsFn(m_toolId);
  63. nodePaletteConfig.m_editorId = m_toolId;
  64. nodePaletteConfig.m_mimeType = m_graphViewSettingsPtr->m_nodeMimeType.c_str();
  65. nodePaletteConfig.m_isInContextMenu = false;
  66. nodePaletteConfig.m_saveIdentifier = m_graphViewSettingsPtr->m_nodeSaveIdentifier;
  67. m_nodePalette = aznew GraphCanvas::NodePaletteDockWidget(this, "Node Palette", nodePaletteConfig);
  68. AddDockWidget("Node Palette", m_nodePalette, Qt::LeftDockWidgetArea);
  69. AZ::IO::FixedMaxPath resolvedPath;
  70. AZ::IO::FileIOBase::GetInstance()->ReplaceAlias(resolvedPath, m_graphViewSettingsPtr->m_translationPath.c_str());
  71. const AZ::IO::FixedMaxPathString translationFilePath = resolvedPath.LexicallyNormal().FixedMaxPathString();
  72. if (m_translator.load(QLocale::Language::English, translationFilePath.c_str()))
  73. {
  74. if (!qApp->installTranslator(&m_translator))
  75. {
  76. AZ_Warning("PassCanvas", false, "Error installing translation %s!", translationFilePath.c_str());
  77. }
  78. }
  79. else
  80. {
  81. AZ_Warning("PassCanvas", false, "Error loading translation file %s", translationFilePath.c_str());
  82. }
  83. // Set up style sheet to fix highlighting in the node palette
  84. AzQtComponents::StyleManager::setStyleSheet(this, QStringLiteral(":/GraphView/GraphView.qss"));
  85. OnDocumentOpened(AZ::Uuid::CreateNull());
  86. }
  87. void PassCanvasMainWindow::OnDocumentOpened(const AZ::Uuid& documentId)
  88. {
  89. Base::OnDocumentOpened(documentId);
  90. m_documentInspector->SetDocumentId(documentId);
  91. }
  92. void PassCanvasMainWindow::ResizeViewportRenderTarget(uint32_t width, uint32_t height)
  93. {
  94. QSize requestedViewportSize = QSize(width, height) / devicePixelRatioF();
  95. QSize currentViewportSize = m_passViewport->size();
  96. QSize offset = requestedViewportSize - currentViewportSize;
  97. QSize requestedWindowSize = size() + offset;
  98. resize(requestedWindowSize);
  99. AZ_Assert(
  100. m_passViewport->size() == requestedViewportSize,
  101. "Resizing the window did not give the expected viewport size. Requested %d x %d but got %d x %d.",
  102. requestedViewportSize.width(), requestedViewportSize.height(), m_passViewport->size().width(),
  103. m_passViewport->size().height());
  104. [[maybe_unused]] QSize newDeviceSize = m_passViewport->size();
  105. AZ_Warning(
  106. "Pass Canvas",
  107. static_cast<uint32_t>(newDeviceSize.width()) == width && static_cast<uint32_t>(newDeviceSize.height()) == height,
  108. "Resizing the window did not give the expected frame size. Requested %d x %d but got %d x %d.", width, height,
  109. newDeviceSize.width(), newDeviceSize.height());
  110. }
  111. void PassCanvasMainWindow::LockViewportRenderTargetSize(uint32_t width, uint32_t height)
  112. {
  113. m_passViewport->LockRenderTargetSize(width, height);
  114. }
  115. void PassCanvasMainWindow::UnlockViewportRenderTargetSize()
  116. {
  117. m_passViewport->UnlockRenderTargetSize();
  118. }
  119. void PassCanvasMainWindow::PopulateSettingsInspector(AtomToolsFramework::InspectorWidget* inspector) const
  120. {
  121. m_passCanvasCompileSettingsGroup = AtomToolsFramework::CreateSettingsPropertyGroup(
  122. "Pass Canvas Settings",
  123. "Pass Canvas Settings",
  124. { AtomToolsFramework::CreateSettingsPropertyValue(
  125. "/O3DE/Atom/PassCanvas/CreateDefaultDocumentOnStart",
  126. "Create Untitled Graph Document On Start",
  127. "Create a default, untitled graph document when Pass Canvas starts",
  128. true) });
  129. inspector->AddGroup(
  130. m_passCanvasCompileSettingsGroup->m_name,
  131. m_passCanvasCompileSettingsGroup->m_displayName,
  132. m_passCanvasCompileSettingsGroup->m_description,
  133. new AtomToolsFramework::InspectorPropertyGroupWidget(
  134. m_passCanvasCompileSettingsGroup.get(),
  135. m_passCanvasCompileSettingsGroup.get(),
  136. azrtti_typeid<AtomToolsFramework::DynamicPropertyGroup>()));
  137. inspector->AddGroup(
  138. "Graph View Settings",
  139. "Graph View Settings",
  140. "Configuration settings for the graph view interaction, animation, and other behavior.",
  141. new AtomToolsFramework::InspectorPropertyGroupWidget(
  142. m_graphViewSettingsPtr.get(), m_graphViewSettingsPtr.get(), m_graphViewSettingsPtr->RTTI_Type()));
  143. Base::PopulateSettingsInspector(inspector);
  144. }
  145. void PassCanvasMainWindow::OnSettingsDialogClosed()
  146. {
  147. AtomToolsFramework::SetSettingsObject("/O3DE/Atom/GraphView/ViewSettings", m_graphViewSettingsPtr);
  148. Base::OnSettingsDialogClosed();
  149. }
  150. AZStd::string PassCanvasMainWindow::GetHelpUrl() const
  151. {
  152. return "https://docs.o3de.org/docs/atom-guide/look-dev/tools/";
  153. }
  154. } // namespace PassCanvas
  155. #include <Window/moc_PassCanvasMainWindow.cpp>