@ -76,6 +76,7 @@ namespace AZ::Render
{
m_selectedChanged = true;
m_attachmentId = AZ::RHI::AttachmentId{};
m_slotName = AZ::Name{};
}
}
@ -88,13 +89,12 @@ namespace AZ::Render
m_readback->SetCallback(AZStd::bind(&ImGuiPassTree::ReadbackCallback, this, AZStd::placeholders::_1));
}
if (m_selectedPass && !m_attachmentId .IsEmpty())
if (m_selectedPass && !m_slotName .IsEmpty())
{
AZ::RPI::RenderPass* renderPass = azrtti_cast<AZ::RPI::RenderPass*>(m_selectedPass );
if (renderPass )
bool readbackResult = m_selectedPass->ReadbackAttachment(m_readback, m_slotName );
if (!readbackResult )
{
AZ::RPI::PassAttachment* attachment = FindPassAttachment(renderPass, m_attachmentId);
renderPass->ReadbackAttachment(m_readback, attachment);
AZ_Error("ImGuiPassTree", false, "Failed to readback attachment from pass [%s] slot [%s]", m_selectedPass->GetName().GetCStr(), m_slotName.GetCStr());
}
}
}
@ -145,44 +145,7 @@ namespace AZ::Render
ImGui::End();
}
inline void ImGuiPassTree::DrawTreeView(AZ::RPI::Pass* pass)
{
AZ::RPI::ParentPass* asParent = pass->AsParent();
bool enabled = pass->IsEnabled();
if (!enabled)
{
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
}
if (!asParent)
{
// For leaf passes
if (!m_showAttachments)
{
// Only draw the leaf pass as selectable if we are not showing attachments as its children
if (Scriptable_ImGui::Selectable(pass->GetName().GetCStr(), m_selectedPass == pass))
{
m_selectedPass = pass;
m_attachmentId = AZ::RHI::AttachmentId{};
m_selectedChanged = true;
}
}
else
{
// Draw the pass as a tree node which has attachments as its children
ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_DefaultOpen
| ((m_selectedPass == pass) ? ImGuiTreeNodeFlags_Selected : 0);
bool nodeOpen = Scriptable_ImGui::TreeNodeEx(pass->GetName().GetCStr(), flags);
if (ImGui::IsItemClicked())
{
m_selectedPass = pass;
m_attachmentId = AZ::RHI::AttachmentId{};
m_selectedChanged = true;
}
if (nodeOpen)
inline void ImGuiPassTree::DrawPassAttachments(AZ::RPI::Pass* pass)
{
for (const auto& binding : pass->GetAttachmentBindings())
{
@ -240,6 +203,7 @@ namespace AZ::Render
{
m_selectedPass = pass;
m_attachmentId = binding.m_attachment->GetAttachmentId();
m_slotName = binding.m_name;
m_selectedChanged = true;
}
}
@ -250,6 +214,51 @@ namespace AZ::Render
}
}
}
inline void ImGuiPassTree::DrawTreeView(AZ::RPI::Pass* pass)
{
AZ::RPI::ParentPass* asParent = pass->AsParent();
bool enabled = pass->IsEnabled();
if (!enabled)
{
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6f, 0.6f, 0.6f, 1.0f));
}
if (!asParent)
{
// For leaf passes
if (!m_showAttachments)
{
// Only draw the leaf pass as selectable if we are not showing attachments as its children
if (Scriptable_ImGui::Selectable(pass->GetName().GetCStr(), m_selectedPass == pass))
{
m_selectedPass = pass;
m_attachmentId = AZ::RHI::AttachmentId{};
m_slotName = AZ::Name{};
m_selectedChanged = true;
}
}
else
{
// Draw the pass as a tree node which has attachments as its children
ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_DefaultOpen
| ((m_selectedPass == pass) ? ImGuiTreeNodeFlags_Selected : 0);
bool nodeOpen = Scriptable_ImGui::TreeNodeEx(pass->GetName().GetCStr(), flags);
if (ImGui::IsItemClicked())
{
m_selectedPass = pass;
m_attachmentId = AZ::RHI::AttachmentId{};
m_slotName = AZ::Name{};
m_selectedChanged = true;
}
if (nodeOpen)
{
DrawPassAttachments(pass);
Scriptable_ImGui::TreePop();
}
}
@ -266,11 +275,13 @@ namespace AZ::Render
{
m_selectedPass = pass;
m_attachmentId = AZ::RHI::AttachmentId{};
m_slotName = AZ::Name{};
m_selectedChanged = true;
}
if (nodeOpen)
{
DrawPassAttachments(pass);
for (const auto& child : asParent->GetChildren())
{
DrawTreeView(child.get());
@ -354,6 +365,7 @@ namespace AZ::Render
m_selectedPass = nullptr;
m_attachmentId = AZ::RHI::AttachmentId{};
m_slotName = AZ::Name{};
m_selectedChanged = false;
m_readback = nullptr;
m_previewPass = nullptr;