From a71a5746ccd6734a68b8c592cab757879993301f Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Tue, 13 Apr 2021 17:15:10 +0100
Subject: [PATCH 001/132] [LY-113714] Jira: LY-113714
https://jira.agscollab.com/browse/LY-113714
---
.../Serialization/EditContextConstants.inl | 2 +
.../Components/img/UI20/line.svg | 7 ++++
.../AzQtComponents/Components/resources.qrc | 1 +
.../UI/PropertyEditor/PropertyRowWidget.cpp | 37 ++++++++++++++++++-
.../UI/PropertyEditor/PropertyRowWidget.hxx | 8 ++++
Code/Sandbox/Editor/Style/Editor.qss | 5 +++
Gems/Vegetation/Code/Source/Descriptor.cpp | 2 +
7 files changed, 61 insertions(+), 1 deletion(-)
create mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
diff --git a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
index d4658d4e8c..de67013741 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
+++ b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
@@ -62,6 +62,8 @@ namespace AZ
const static AZ::Crc32 ButtonTooltip = AZ_CRC("ButtonTooltip", 0x1605a7d2);
const static AZ::Crc32 CheckboxTooltip = AZ_CRC("CheckboxTooltip", 0x1159eb78);
const static AZ::Crc32 CheckboxDefaultValue = AZ_CRC("CheckboxDefaultValue", 0x03f117e6);
+ //! Emboldens the text and adds a line above this item within the RPE.
+ const static AZ::Crc32 RPESectionSeparator = AZ_CRC("RPESectionSeparator", 0xc6249a95);
//! Affects the display order of a node relative to it's parent/children. Higher values display further down (after) lower values. Default is 0, negative values are allowed. Must be applied as an attribute to the EditorData element
const static AZ::Crc32 DisplayOrder = AZ_CRC("DisplayOrder", 0x23660ec2);
//! Specifies whether the UI should support multi-edit for aggregate instances of this property
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
new file mode 100644
index 0000000000..60f7c07c8d
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
@@ -0,0 +1,7 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
index 77dead96a1..decc1bd72f 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
@@ -627,6 +627,7 @@
img/UI20/Settings.svg
img/UI20/Asset_Folder.svg
img/UI20/Asset_File.svg
+ img/UI20/line.svg
img/UI20/AssetEditor/default_document.svg
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
index 8c371baf8c..a16c1f7480 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
@@ -44,6 +44,24 @@ namespace AzToolsFramework
m_iconOpen = s_iconOpen;
m_iconClosed = s_iconClosed;
+ m_outerLayout = new QVBoxLayout(nullptr);
+ m_outerLayout->setSpacing(0);
+ m_outerLayout->setContentsMargins(0, 0, 0, 0);
+
+ // separatorLayout will contain a spacer and a separator line. The width of the spacer is adjusted later to ensure the line is the
+ // correct length.
+ QHBoxLayout* separatorLayout = new QHBoxLayout(nullptr);
+ m_outerLayout->addLayout(separatorLayout);
+
+ m_separatorIndent = new QSpacerItem(1, 1);
+ separatorLayout->addItem(m_separatorIndent);
+
+ m_separatorLine.load(QStringLiteral(":/Gallery/line.svg"));
+ m_separatorLine.setFixedHeight(3);
+
+ separatorLayout->addWidget(&m_separatorLine);
+ m_separatorLine.setVisible(false);
+
m_mainLayout = new QHBoxLayout();
m_mainLayout->setSpacing(0);
m_mainLayout->setContentsMargins(0, 1, 0, 1);
@@ -118,7 +136,8 @@ namespace AzToolsFramework
m_handler = nullptr;
m_containerSize = 0;
- setLayout(m_mainLayout);
+ m_outerLayout->addLayout(m_mainLayout);
+ setLayout(m_outerLayout);
}
bool PropertyRowWidget::HasChildWidgetAlready() const
@@ -301,6 +320,9 @@ namespace AzToolsFramework
}
}
+ m_isSectionSeparator = false;
+ m_separatorLine.setVisible(false);
+
RefreshAttributesFromNode(true);
// --------------------- HANDLER discovery:
@@ -946,6 +968,11 @@ namespace AzToolsFramework
{
HandleChangeNotifyAttribute(reader, m_sourceNode ? m_sourceNode->GetParent() : nullptr, m_editingCompleteNotifiers);
}
+ else if (attributeName == AZ::Edit::Attributes::RPESectionSeparator)
+ {
+ m_separatorLine.setVisible(true);
+ m_isSectionSeparator = true;
+ }
}
void PropertyRowWidget::SetReadOnlyQueryFunction(const ReadOnlyQueryFunction& readOnlyQueryFunction)
@@ -1070,6 +1097,7 @@ namespace AzToolsFramework
{
m_dropDownArrow->hide();
}
+ m_separatorIndent->changeSize((m_treeDepth * m_treeIndentation) + m_leafIndentation, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_indent->changeSize((m_treeDepth * m_treeIndentation) + m_leafIndentation, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_leftHandSideLayout->invalidate();
m_leftHandSideLayout->update();
@@ -1085,6 +1113,7 @@ namespace AzToolsFramework
connect(m_dropDownArrow, &QCheckBox::clicked, this, &PropertyRowWidget::OnClickedExpansionButton);
}
m_dropDownArrow->show();
+ m_separatorIndent->changeSize((m_treeDepth * m_treeIndentation), 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_indent->changeSize((m_treeDepth * m_treeIndentation), 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_leftHandSideLayout->invalidate();
m_leftHandSideLayout->update();
@@ -1095,6 +1124,7 @@ namespace AzToolsFramework
void PropertyRowWidget::SetIndentSize(int w)
{
+ m_separatorIndent->changeSize(w, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_indent->changeSize(w, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_leftHandSideLayout->invalidate();
m_leftHandSideLayout->update();
@@ -1318,6 +1348,11 @@ namespace AzToolsFramework
return canBeTopLevel(this);
}
+ bool PropertyRowWidget::IsSectionSeparator() const
+ {
+ return m_isSectionSeparator;
+ }
+
bool PropertyRowWidget::GetAppendDefaultLabelToName()
{
return false;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index e4b538ccdc..af1b68b66f 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -25,6 +25,7 @@ AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // class '...' needs t
#include
#include
#include
+#include
#include
AZ_POP_DISABLE_WARNING
@@ -44,6 +45,7 @@ namespace AzToolsFramework
Q_PROPERTY(bool hasChildRows READ HasChildRows);
Q_PROPERTY(bool isTopLevel READ IsTopLevel);
Q_PROPERTY(int getLevel READ GetLevel);
+ Q_PROPERTY(bool isSectionSeparator READ IsSectionSeparator);
Q_PROPERTY(bool appendDefaultLabelToName READ GetAppendDefaultLabelToName WRITE AppendDefaultLabelToName)
public:
AZ_CLASS_ALLOCATOR(PropertyRowWidget, AZ::SystemAllocator, 0)
@@ -82,6 +84,7 @@ namespace AzToolsFramework
PropertyRowWidget* GetParentRow() const { return m_parentRow; }
int GetLevel() const;
bool IsTopLevel() const;
+ bool IsSectionSeparator() const;
// Remove the default label and append the text to the name label.
bool GetAppendDefaultLabelToName();
@@ -161,6 +164,9 @@ namespace AzToolsFramework
QHBoxLayout* m_leftHandSideLayout;
QHBoxLayout* m_middleLayout;
QHBoxLayout* m_rightHandSideLayout;
+ QVBoxLayout* m_outerLayout;
+ QSvgWidget m_separatorLine;
+ QSpacerItem* m_separatorIndent;
QPointer m_dropDownArrow;
QPointer m_containerClearButton;
@@ -229,6 +235,8 @@ namespace AzToolsFramework
int m_treeIndentation = 14;
int m_leafIndentation = 16;
+ bool m_isSectionSeparator = false;
+
QIcon m_iconOpen;
QIcon m_iconClosed;
diff --git a/Code/Sandbox/Editor/Style/Editor.qss b/Code/Sandbox/Editor/Style/Editor.qss
index 0c3f64b85c..7887560105 100644
--- a/Code/Sandbox/Editor/Style/Editor.qss
+++ b/Code/Sandbox/Editor/Style/Editor.qss
@@ -38,6 +38,11 @@ AzToolsFramework--ComponentPaletteWidget > QTreeView
background-color: #222222;
}
+AzToolsFramework--PropertyRowWidget[isSectionSeparator="true"] QLabel#Name
+{
+ font-weight: bold;
+}
+
/* Style for visualizing property values overridden from their prefab values */
AzToolsFramework--PropertyRowWidget[IsOverridden=true] #Name QLabel,
AzToolsFramework--ComponentEditorHeader #Title[IsOverridden="true"]
diff --git a/Gems/Vegetation/Code/Source/Descriptor.cpp b/Gems/Vegetation/Code/Source/Descriptor.cpp
index 93a301f073..4fd1037f09 100644
--- a/Gems/Vegetation/Code/Source/Descriptor.cpp
+++ b/Gems/Vegetation/Code/Source/Descriptor.cpp
@@ -170,6 +170,8 @@ namespace Vegetation
{
edit->Class(
"Vegetation Descriptor", "Details used to create vegetation instances")
+ ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+ ->Attribute(AZ::Edit::Attributes::RPESectionSeparator, true)
// For this ComboBox to actually work, there is a PropertyHandler registration in EditorVegetationSystemComponent.cpp
->DataElement(AZ::Edit::UIHandlers::ComboBox, &Descriptor::m_spawnerType, "Instance Spawner", "The type of instances to spawn")
->Attribute(AZ::Edit::Attributes::GenericValueList, &Descriptor::GetSpawnerTypeList)
From a94700786133526d14971bddfdd87e5d989d8678 Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Wed, 14 Apr 2021 15:15:42 +0100
Subject: [PATCH 002/132] Darken line
---
.../AzQtComponents/AzQtComponents/Components/img/UI20/line.svg | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
index 60f7c07c8d..fe01efddba 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
@@ -2,6 +2,6 @@
\ No newline at end of file
From 2dbd9e4a050e141a45c85a12b4d245f0695f581a Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Mon, 19 Apr 2021 15:54:41 +0100
Subject: [PATCH 003/132] Changed to use direct line drawing rather than adding
svg.
---
.../Components/img/UI20/line.svg | 7 ----
.../UI/PropertyEditor/PropertyRowWidget.cpp | 40 +++++++------------
.../UI/PropertyEditor/PropertyRowWidget.hxx | 4 +-
3 files changed, 16 insertions(+), 35 deletions(-)
delete mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
deleted file mode 100644
index fe01efddba..0000000000
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/line.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
\ No newline at end of file
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
index a16c1f7480..5b02e81e6d 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
@@ -27,6 +27,7 @@ AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option") // 4244: con
#include
#include
#include
+#include
AZ_POP_DISABLE_WARNING
static const int LabelColumnStretch = 2;
@@ -44,24 +45,6 @@ namespace AzToolsFramework
m_iconOpen = s_iconOpen;
m_iconClosed = s_iconClosed;
- m_outerLayout = new QVBoxLayout(nullptr);
- m_outerLayout->setSpacing(0);
- m_outerLayout->setContentsMargins(0, 0, 0, 0);
-
- // separatorLayout will contain a spacer and a separator line. The width of the spacer is adjusted later to ensure the line is the
- // correct length.
- QHBoxLayout* separatorLayout = new QHBoxLayout(nullptr);
- m_outerLayout->addLayout(separatorLayout);
-
- m_separatorIndent = new QSpacerItem(1, 1);
- separatorLayout->addItem(m_separatorIndent);
-
- m_separatorLine.load(QStringLiteral(":/Gallery/line.svg"));
- m_separatorLine.setFixedHeight(3);
-
- separatorLayout->addWidget(&m_separatorLine);
- m_separatorLine.setVisible(false);
-
m_mainLayout = new QHBoxLayout();
m_mainLayout->setSpacing(0);
m_mainLayout->setContentsMargins(0, 1, 0, 1);
@@ -136,8 +119,20 @@ namespace AzToolsFramework
m_handler = nullptr;
m_containerSize = 0;
- m_outerLayout->addLayout(m_mainLayout);
- setLayout(m_outerLayout);
+ setLayout(m_mainLayout);
+ }
+
+ void PropertyRowWidget::paintEvent(QPaintEvent* event)
+ {
+ QStylePainter p(this);
+
+ if (IsSectionSeparator())
+ {
+ const QPen linePen(QColor(0x3B3E3F));
+ p.setPen(linePen);
+ int indent = m_treeDepth * m_treeIndentation;
+ p.drawLine(event->rect().topLeft() + QPoint(indent, 0), event->rect().topRight());
+ }
}
bool PropertyRowWidget::HasChildWidgetAlready() const
@@ -321,7 +316,6 @@ namespace AzToolsFramework
}
m_isSectionSeparator = false;
- m_separatorLine.setVisible(false);
RefreshAttributesFromNode(true);
@@ -970,7 +964,6 @@ namespace AzToolsFramework
}
else if (attributeName == AZ::Edit::Attributes::RPESectionSeparator)
{
- m_separatorLine.setVisible(true);
m_isSectionSeparator = true;
}
}
@@ -1097,7 +1090,6 @@ namespace AzToolsFramework
{
m_dropDownArrow->hide();
}
- m_separatorIndent->changeSize((m_treeDepth * m_treeIndentation) + m_leafIndentation, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_indent->changeSize((m_treeDepth * m_treeIndentation) + m_leafIndentation, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_leftHandSideLayout->invalidate();
m_leftHandSideLayout->update();
@@ -1113,7 +1105,6 @@ namespace AzToolsFramework
connect(m_dropDownArrow, &QCheckBox::clicked, this, &PropertyRowWidget::OnClickedExpansionButton);
}
m_dropDownArrow->show();
- m_separatorIndent->changeSize((m_treeDepth * m_treeIndentation), 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_indent->changeSize((m_treeDepth * m_treeIndentation), 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_leftHandSideLayout->invalidate();
m_leftHandSideLayout->update();
@@ -1124,7 +1115,6 @@ namespace AzToolsFramework
void PropertyRowWidget::SetIndentSize(int w)
{
- m_separatorIndent->changeSize(w, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_indent->changeSize(w, 1, QSizePolicy::Fixed, QSizePolicy::Fixed);
m_leftHandSideLayout->invalidate();
m_leftHandSideLayout->update();
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index af1b68b66f..d08779caa4 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -129,6 +129,7 @@ namespace AzToolsFramework
void SetSelectionEnabled(bool selectionEnabled);
void SetSelected(bool selected);
bool eventFilter(QObject *watched, QEvent *event) override;
+ void paintEvent(QPaintEvent*) override;
/// Apply tooltip to widget and some of its children.
void SetDescription(const QString& text);
@@ -164,9 +165,6 @@ namespace AzToolsFramework
QHBoxLayout* m_leftHandSideLayout;
QHBoxLayout* m_middleLayout;
QHBoxLayout* m_rightHandSideLayout;
- QVBoxLayout* m_outerLayout;
- QSvgWidget m_separatorLine;
- QSpacerItem* m_separatorIndent;
QPointer m_dropDownArrow;
QPointer m_containerClearButton;
From b1d8330870f31399d05aa0c1d1b28e5f55512580 Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Tue, 20 Apr 2021 17:20:19 +0100
Subject: [PATCH 004/132] Review fixes.
---
.../AzQtComponents/AzQtComponents/Components/resources.qrc | 1 -
.../AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx | 1 -
2 files changed, 2 deletions(-)
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
index e253c6492d..f9e601fb6d 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
@@ -630,7 +630,6 @@
img/UI20/Settings.svg
img/UI20/Asset_Folder.svg
img/UI20/Asset_File.svg
- img/UI20/line.svg
img/UI20/AssetEditor/default_document.svg
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index d08779caa4..2fb695fca5 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -25,7 +25,6 @@ AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // class '...' needs t
#include
#include
#include
-#include
#include
AZ_POP_DISABLE_WARNING
From 304696fa5cc59b3b517d5545844d2d25d35ee610 Mon Sep 17 00:00:00 2001
From: moudgils
Date: Tue, 27 Apr 2021 19:26:35 -0700
Subject: [PATCH 005/132] Shader compile fixes
---
.../DiffuseComposite_nomsaa.azsl | 8 ++++----
Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl
index 74571b5c6a..c243af0855 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl
@@ -91,7 +91,7 @@ float3 SampleProbeIrradiance(uint2 probeIrradianceCoords, float depth, float3 no
{
for (int x = -extent; x <= extent; ++x)
{
- float3 downsampledNormal = PassSrg::m_downsampledNormal.Load(int3(probeIrradianceCoords, 0), int2(x, y)).rgb;
+ float3 downsampledNormal = PassSrg::m_downsampledNormal.Load(int3(probeIrradianceCoords + int2(x, y), 0)).rgb;
downsampledNormal = downsampledNormal * 2.0f - 1.0f;
float normalDot = dot(downsampledNormal, normal);
@@ -100,10 +100,10 @@ float3 SampleProbeIrradiance(uint2 probeIrradianceCoords, float depth, float3 no
if (normalDot > NormalMatchTolerance)
{
// the normals are almost identical, if the depth is within the tolerance we can optimize by just taking this sample
- float downsampledDepth = PassSrg::m_downsampledDepth.Load(int3(probeIrradianceCoords, 0), int2(x, y)).r;
+ float downsampledDepth = PassSrg::m_downsampledDepth.Load(int3(probeIrradianceCoords + int2(x, y), 0)).r;
if (abs(depth - downsampledDepth) <= DepthTolerance)
{
- float3 probeIrradiance = PassSrg::m_downsampledProbeIrradiance.Load(int3(probeIrradianceCoords,0), int2(x, y)).rgb;
+ float3 probeIrradiance = PassSrg::m_downsampledProbeIrradiance.Load(int3(probeIrradianceCoords + int2(x, y),0)).rgb;
probeIrradiance = saturate(probeIrradiance);
return probeIrradiance;
}
@@ -115,7 +115,7 @@ float3 SampleProbeIrradiance(uint2 probeIrradianceCoords, float depth, float3 no
}
}
- float3 probeIrradiance = PassSrg::m_downsampledProbeIrradiance.Load(int3(probeIrradianceCoords, 0), closestOffset).rgb;
+ float3 probeIrradiance = PassSrg::m_downsampledProbeIrradiance.Load(int3(probeIrradianceCoords + closestOffset, 0)).rgb;
probeIrradiance = saturate(probeIrradiance);
return probeIrradiance;
}
diff --git a/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp b/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp
index 00b5dada69..957c076592 100644
--- a/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp
+++ b/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp
@@ -308,7 +308,7 @@ namespace AZ
uint32_t exitCode = 0;
bool timedOut = false;
- const AZStd::sys_time_t maxWaitTimeSeconds = 120;
+ const AZStd::sys_time_t maxWaitTimeSeconds = 240;
const AZStd::sys_time_t startTimeSeconds = AZStd::GetTimeNowSecond();
const AZStd::sys_time_t startTime = AZStd::GetTimeNowTicks();
From 12d5288e32ea98420d2585498e2d5fb02c731963 Mon Sep 17 00:00:00 2001
From: puvvadar
Date: Wed, 28 Apr 2021 15:15:14 -0700
Subject: [PATCH 006/132] Add codegen for BehaviorContext binding of RPC Send
functions
---
.../Source/AutoGen/AutoComponent_Header.jinja | 1 +
.../Source/AutoGen/AutoComponent_Source.jinja | 34 +++++++++++++++++++
...tionPlayerInputComponent.AutoComponent.xml | 6 ++--
3 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja
index f5774b07c0..b2d2792e9b 100644
--- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja
+++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja
@@ -416,6 +416,7 @@ namespace {{ Component.attrib['Namespace'] }}
static void Reflect(AZ::ReflectContext* context);
static void ReflectToEditContext(AZ::ReflectContext* context);
+ static void ReflectToBehaviorContext(AZ::ReflectContext* context);
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja
index d6907876e1..f2d6ca71c6 100644
--- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja
+++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja
@@ -315,6 +315,22 @@ void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(par
{% endmacro %}
{#
+#}
+{% macro ReflectRpcInvocations(Component, ClassName, InvokeFrom, HandleOn) %}
+{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %}
+{% if Property.attrib['CanScript']|booleanTrue == true %}
+{% set paramNames = [] %}
+{% set paramTypes = [] %}
+{% set paramDefines = [] %}
+{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }}
+ ->Method("{{ UpperFirst(Property.attrib['Name']) }}", [](const {{ ClassName }}* self, {{ ', '.join(paramDefines) }}) {
+ self->m_controller->{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }});
+ })
+{% endif %}
+{% endcall %}
+{% endmacro %}
+{#
+
#}
{% macro DeclareRpcHandleCases(Component, ComponentDerived, InvokeFrom, HandleOn, ValidationFunction) %}
{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %}
@@ -1114,6 +1130,7 @@ namespace {{ Component.attrib['Namespace'] }}
{{ DefineArchetypePropertyReflection(Component, ComponentBaseName)|indent(16) }};
}
ReflectToEditContext(context);
+ ReflectToBehaviorContext(context);
}
void {{ ComponentBaseName }}::{{ ComponentBaseName }}::ReflectToEditContext(AZ::ReflectContext* context)
@@ -1138,6 +1155,23 @@ namespace {{ Component.attrib['Namespace'] }}
}
}
+ void {{ ComponentBaseName }}::{{ ComponentBaseName }}::ReflectToBehaviorContext(AZ::ReflectContext* context)
+ {
+ AZ::BehaviorContext* behaviorContext = azrtti_cast(context);
+ if (behaviorContext)
+ {
+ behaviorContext->Class<{{ ComponentName }}>("{{ ComponentName }}")
+ ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+ ->Attribute(AZ::Script::Attributes::Category, "Multiplayer")
+ ->Attribute(AZ::Script::Attributes::Module, "Multiplayer")
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Server', 'Authority')|indent(4) -}}
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Autonomous', 'Authority')|indent(4) -}}
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Authority', 'Autonomous')|indent(4) -}}
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Authority', 'Client')|indent(4) -}}
+ ;
+ }
+ }
+
void {{ ComponentBaseName }}::{{ ComponentBaseName }}::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
{
provided.push_back(AZ_CRC_CE("{{ ComponentName }}Service"));
diff --git a/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml b/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml
index d38ebbb1b8..336909a102 100644
--- a/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml
+++ b/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml
@@ -18,18 +18,18 @@
-
+
-
+
-
+
From 7eb6cc10b6559511927028d9f6c5514b973a99bb Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Wed, 5 May 2021 08:57:39 +0100
Subject: [PATCH 007/132] Made change affect all modifiable containers.
---
.../Serialization/EditContextConstants.inl | 2 --
.../UI/PropertyEditor/PropertyRowWidget.cpp | 22 +++++++++++++------
.../UI/PropertyEditor/PropertyRowWidget.hxx | 5 +++--
Gems/Vegetation/Code/Source/Descriptor.cpp | 2 --
4 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
index 481ae5a91c..90b9ba5afd 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
+++ b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
@@ -62,8 +62,6 @@ namespace AZ
const static AZ::Crc32 ButtonTooltip = AZ_CRC("ButtonTooltip", 0x1605a7d2);
const static AZ::Crc32 CheckboxTooltip = AZ_CRC("CheckboxTooltip", 0x1159eb78);
const static AZ::Crc32 CheckboxDefaultValue = AZ_CRC("CheckboxDefaultValue", 0x03f117e6);
- //! Emboldens the text and adds a line above this item within the RPE.
- const static AZ::Crc32 RPESectionSeparator = AZ_CRC("RPESectionSeparator", 0xc6249a95);
//! Affects the display order of a node relative to it's parent/children. Higher values display further down (after) lower values. Default is 0, negative values are allowed. Must be applied as an attribute to the EditorData element
const static AZ::Crc32 DisplayOrder = AZ_CRC("DisplayOrder", 0x23660ec2);
//! Specifies whether the UI should support multi-edit for aggregate instances of this property
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
index 5b02e81e6d..faeae0a06d 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
@@ -315,8 +315,6 @@ namespace AzToolsFramework
}
}
- m_isSectionSeparator = false;
-
RefreshAttributesFromNode(true);
// --------------------- HANDLER discovery:
@@ -962,10 +960,6 @@ namespace AzToolsFramework
{
HandleChangeNotifyAttribute(reader, m_sourceNode ? m_sourceNode->GetParent() : nullptr, m_editingCompleteNotifiers);
}
- else if (attributeName == AZ::Edit::Attributes::RPESectionSeparator)
- {
- m_isSectionSeparator = true;
- }
}
void PropertyRowWidget::SetReadOnlyQueryFunction(const ReadOnlyQueryFunction& readOnlyQueryFunction)
@@ -1340,7 +1334,7 @@ namespace AzToolsFramework
bool PropertyRowWidget::IsSectionSeparator() const
{
- return m_isSectionSeparator;
+ return CanBeReordered();
}
bool PropertyRowWidget::GetAppendDefaultLabelToName()
@@ -1686,6 +1680,20 @@ namespace AzToolsFramework
m_nameLabel->setFilter(m_currentFilterString);
}
+ bool PropertyRowWidget::CanChildrenBeReordered() const
+ {
+ return m_containerEditable;
+ }
+
+ bool PropertyRowWidget::CanBeReordered() const
+ {
+ if (!m_parentRow)
+ {
+ return false;
+ }
+
+ return m_parentRow->CanChildrenBeReordered();
+ }
}
#include "UI/PropertyEditor/moc_PropertyRowWidget.cpp"
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index 2fb695fca5..b6c94dc98b 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -149,6 +149,9 @@ namespace AzToolsFramework
QLabel* GetNameLabel() { return m_nameLabel; }
void SetIndentSize(int w);
void SetAsCustom(bool custom) { m_custom = custom; }
+
+ bool CanChildrenBeReordered() const;
+ bool CanBeReordered() const;
protected:
int CalculateLabelWidth() const;
@@ -232,8 +235,6 @@ namespace AzToolsFramework
int m_treeIndentation = 14;
int m_leafIndentation = 16;
- bool m_isSectionSeparator = false;
-
QIcon m_iconOpen;
QIcon m_iconClosed;
diff --git a/Gems/Vegetation/Code/Source/Descriptor.cpp b/Gems/Vegetation/Code/Source/Descriptor.cpp
index 45ec25038d..ecda8415e7 100644
--- a/Gems/Vegetation/Code/Source/Descriptor.cpp
+++ b/Gems/Vegetation/Code/Source/Descriptor.cpp
@@ -170,8 +170,6 @@ namespace Vegetation
{
edit->Class(
"Vegetation Descriptor", "Details used to create vegetation instances")
- ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::RPESectionSeparator, true)
// For this ComboBox to actually work, there is a PropertyHandler registration in EditorVegetationSystemComponent.cpp
->DataElement(AZ::Edit::UIHandlers::ComboBox, &Descriptor::m_spawnerType, "Instance Spawner", "The type of instances to spawn")
->Attribute(AZ::Edit::Attributes::GenericValueList, &Descriptor::GetSpawnerTypeList)
From e2ca84ceb253d0930a006b45c66f745d4f597c8a Mon Sep 17 00:00:00 2001
From: moudgils
Date: Fri, 7 May 2021 17:41:24 -0700
Subject: [PATCH 008/132] More fixes to shaders with the latest dxc
---
.../Assets/Materials/Types/EnhancedPBR_ForwardPass.shader | 3 +--
.../DiffuseProbeGridDownsample_nomsaa.azsl | 4 ++--
Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp | 2 +-
.../Code/Source/Platform/Windows/Vulkan_Traits_Windows.h | 2 +-
4 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader
index 7964e3c84a..764b67c82f 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader
@@ -31,8 +31,7 @@
},
"CompilerHints" : {
- "DisableOptimizations" : true,
- "DxcGenerateDebugInfo" : true
+ "DisableOptimizations" : true
},
"ProgramSettings":
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridDownsample_nomsaa.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridDownsample_nomsaa.azsl
index f10fc67da5..d2e73927e0 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridDownsample_nomsaa.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridDownsample_nomsaa.azsl
@@ -70,8 +70,8 @@ PSOutput MainPS(VSOutput IN)
{
for (uint x = 0; x < ImageScale; ++x)
{
- float depth = PassSrg::m_depth.Load(int3(screenCoords, 0), int2(x, y)).r;
- float4 encodedNormal = PassSrg::m_normal.Load(int3(screenCoords, 0), int2(x, y));
+ float depth = PassSrg::m_depth.Load(int3(screenCoords + int2(x, y), 0)).r;
+ float4 encodedNormal = PassSrg::m_normal.Load(int3(screenCoords + int2(x, y), 0));
// take the closest depth sample to ensure we're getting the normal closest to the viewer
// (larger depth value due to reverse depth)
diff --git a/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp b/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp
index 957c076592..00b5dada69 100644
--- a/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp
+++ b/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp
@@ -308,7 +308,7 @@ namespace AZ
uint32_t exitCode = 0;
bool timedOut = false;
- const AZStd::sys_time_t maxWaitTimeSeconds = 240;
+ const AZStd::sys_time_t maxWaitTimeSeconds = 120;
const AZStd::sys_time_t startTimeSeconds = AZStd::GetTimeNowSecond();
const AZStd::sys_time_t startTime = AZStd::GetTimeNowTicks();
diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/Vulkan_Traits_Windows.h b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/Vulkan_Traits_Windows.h
index c7c9902115..c1314aaf66 100644
--- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/Vulkan_Traits_Windows.h
+++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/Vulkan_Traits_Windows.h
@@ -11,7 +11,7 @@
*/
#pragma once
-#define AZ_TRAIT_ATOM_SHADERBUILDER_DXC "Builders/DirectXShaderCompilerAz/dxc.exe"
+#define AZ_TRAIT_ATOM_SHADERBUILDER_DXC "Builders/DirectXShaderCompiler/dxc.exe"
#define AZ_TRAIT_ATOM_VULKAN_DISABLE_DUAL_SOURCE_BLENDING 0
#define AZ_TRAIT_ATOM_VULKAN_DLL "vulkan.dll"
#define AZ_TRAIT_ATOM_VULKAN_DLL_1 "vulkan-1.dll"
From 89bb0edb3082b40de3c9b3737ad31e845b4cdf75 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Mon, 10 May 2021 23:04:56 -0700
Subject: [PATCH 009/132] ATOM-15518 Change Multilayer PBR To Use Lerp Base
Blending
Changed to lerp-based blending, with an implicit base layer.
Renamed some variables to be more clear (blendWeight instead of blendMask, since the weights could come from vertex colors instead of a texture).
Updated DefaultBlendMask_layers.png to better suit the new layering model. It has a black background and overlapping R, G, and B areas.
Updated some of the test materials UV transforms to better fit the new DefaultBlendMask_layers image.
Added a new test object, which is a plane that has painted vertices.
Note that I updated test criteria in AtomSampleViewer to account for these changes as well.
---
.../Types/StandardMultilayerPBR.materialtype | 2 +-
.../Types/StandardMultilayerPBR_Common.azsli | 79 +++++++++++--------
...tandardMultilayerPBR_DepthPass_WithPS.azsl | 2 +-
.../StandardMultilayerPBR_ForwardPass.azsl | 39 +++++----
...tandardMultilayerPBR_Shadowmap_WithPS.azsl | 2 +-
.../Textures/DefaultBlendMask_layers.png | 4 +-
.../001_ManyFeatures.material | 12 ++-
.../002_ParallaxPdo.material | 3 +-
...aterial => 003_Debug_BlendSource.material} | 2 +-
.../TestData/Objects/PaintedPlane.fbx | 3 +
10 files changed, 87 insertions(+), 61 deletions(-)
rename Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/{003_Debug_BlendMaskValues.material => 003_Debug_BlendSource.material} (86%)
create mode 100644 Gems/Atom/TestData/TestData/Objects/PaintedPlane.fbx
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
index e2119dcf12..3e95846b6e 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
@@ -204,7 +204,7 @@
"displayName": "Debug Draw Mode",
"description": "Enables various debug view features.",
"type": "Enum",
- "enumValues": [ "None", "BlendMaskValues", "DepthMaps" ],
+ "enumValues": [ "None", "BlendSource", "DepthMaps" ],
"defaultValue": "None",
"connection": {
"type": "ShaderOption",
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
index ba0eaf2ac1..f1f6d90e14 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
@@ -42,7 +42,7 @@ COMMON_SRG_INPUTS_PARALLAX(prefix)
ShaderResourceGroup MaterialSrg : SRG_PerMaterial
{
- Texture2D m_blendMaskTexture;
+ Texture2D m_blendMaskTexture;
uint m_blendMaskUvIndex;
// Auto-generate material SRG fields for common inputs for each layer
@@ -113,7 +113,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial
// ------ Shader Options ----------------------------------------
-enum class DebugDrawMode { None, BlendMaskValues, DepthMaps };
+enum class DebugDrawMode { None, BlendSource, DepthMaps };
option DebugDrawMode o_debugDrawMode;
enum class BlendMaskSource { TextureMap, VertexColors, Fallback };
@@ -127,6 +127,10 @@ option bool o_blendMask_isBound;
// ------ Blend Utilities ----------------------------------------
+// This is mainly used to pass extra data to the GetDepth callback function during the parallax depth search.
+// But since we have it, we use it in some other functions as well rather than passing it around.
+static float3 s_blendMaskFromVertexStream;
+
//! Returns the BlendMaskSource that will actually be used when rendering (not necessarily the same BlendMaskSource specified by the user)
BlendMaskSource GetFinalBlendMaskSource()
{
@@ -151,40 +155,63 @@ BlendMaskSource GetFinalBlendMaskSource()
}
}
-//! Return the final blend mask values to be used for rendering, based on the available data and configuration.
-float3 GetBlendMaskValues(float2 uv, float3 vertexBlendMask)
+//! Return the raw blend source values directly from the blend mask or vertex colors, depending on the available data and configuration.
+//! layer1 is an implicit base layer
+//! layer2 is weighted by r
+//! layer3 is weighted by g
+//! b is reserved for perhaps a dedicated puddle layer
+float3 GetBlendSourceValues(float2 uv)
{
- float3 blendMaskValues;
+ float3 blendSourceValues = float3(0,0,0);
switch(GetFinalBlendMaskSource())
{
case BlendMaskSource::TextureMap:
- blendMaskValues = MaterialSrg::m_blendMaskTexture.Sample(MaterialSrg::m_sampler, uv).rgb;
+ blendSourceValues = MaterialSrg::m_blendMaskTexture.Sample(MaterialSrg::m_sampler, uv).rgb;
break;
case BlendMaskSource::VertexColors:
- blendMaskValues = vertexBlendMask;
- break;
- case BlendMaskSource::Fallback:
- blendMaskValues = float3(1,1,1);
+ blendSourceValues = s_blendMaskFromVertexStream;
break;
}
- blendMaskValues = blendMaskValues / (blendMaskValues.r + blendMaskValues.g + blendMaskValues.b);
-
- return blendMaskValues;
+ return blendSourceValues;
}
-float BlendLayers(float layer1, float layer2, float layer3, float3 blendMaskValues)
+//! Return the final blend mask values to be used for rendering, based on the available data and configuration.
+//! @return The blend weights for each layer.
+//! Even though layer1 not explicitly specified in the blend source data, it is explicitly included with the returned values.
+//! layer1 = r
+//! layer2 = g
+//! layer3 = b
+float3 GetBlendWeights(float2 uv)
{
- return dot(float3(layer1, layer2, layer3), blendMaskValues);
+ float3 blendSourceValues = GetBlendSourceValues(uv);
+
+ // Calculate blend weights such that multiplying and adding them with layer data is equivalent
+ // to lerping between each layer.
+ // final = lerp(final, layer1, blendWeights.r)
+ // final = lerp(final, layer2, blendWeights.g)
+ // final = lerp(final, layer3, blendWeights.b)
+
+ float3 blendWeights;
+ blendWeights.b = blendSourceValues.g;
+ blendWeights.g = (1.0 - blendSourceValues.g) * blendSourceValues.r;
+ blendWeights.r = (1.0 - blendSourceValues.g) * (1.0 - blendSourceValues.r);
+
+ return blendWeights;
}
-float2 BlendLayers(float2 layer1, float2 layer2, float2 layer3, float3 blendMaskValues)
+
+float BlendLayers(float layer1, float layer2, float layer3, float3 blendWeights)
{
- return layer1 * blendMaskValues.r + layer2 * blendMaskValues.g + layer3 * blendMaskValues.b;
+ return dot(float3(layer1, layer2, layer3), blendWeights);
}
-float3 BlendLayers(float3 layer1, float3 layer2, float3 layer3, float3 blendMaskValues)
+float2 BlendLayers(float2 layer1, float2 layer2, float2 layer3, float3 blendWeights)
{
- return layer1 * blendMaskValues.r + layer2 * blendMaskValues.g + layer3 * blendMaskValues.b;
+ return layer1 * blendWeights.r + layer2 * blendWeights.g + layer3 * blendWeights.b;
+}
+float3 BlendLayers(float3 layer1, float3 layer2, float3 layer3, float3 blendWeights)
+{
+ return layer1 * blendWeights.r + layer2 * blendWeights.g + layer3 * blendWeights.b;
}
// ------ Parallax Utilities ----------------------------------------
@@ -203,16 +230,6 @@ bool ShouldHandleParallaxInDepthShaders()
return ShouldHandleParallax() && o_parallax_enablePixelDepthOffset;
}
-// These static values are used to pass extra data to the GetDepth callback function during the parallax depth search.
-static float3 s_blendMaskFromVertexStream;
-
-//! Setup static variables that are needed by the GetDepth callback function
-//! @param vertexBlendMask the blend mask values from the vertex input stream.
-void GetDepth_Setup(float3 vertexBlendMask)
-{
- s_blendMaskFromVertexStream = vertexBlendMask;
-}
-
// Callback function for ParallaxMapping.azsli
DepthResult GetDepth(float2 uv, float2 uv_ddx, float2 uv_ddy)
{
@@ -260,8 +277,8 @@ DepthResult GetDepth(float2 uv, float2 uv_ddx, float2 uv_ddy)
// Note, when the blend source is BlendMaskSource::VertexColors, parallax will not be able to blend correctly between layers. It will end up using the same blend mask values
// for every UV position when searching for the intersection. This leads to smearing artifacts at the transition point, but these won't be so noticeable as long as
// you have a small depth factor relative to the size of the blend transition.
- float3 blendMaskValues = GetBlendMaskValues(uv, s_blendMaskFromVertexStream);
+ float3 blendWeights = GetBlendWeights(uv);
- float depth = BlendLayers(layerDepthValues.r, layerDepthValues.g, layerDepthValues.b, blendMaskValues);
+ float depth = BlendLayers(layerDepthValues.r, layerDepthValues.g, layerDepthValues.b, blendWeights);
return DepthResultAbsolute(depth);
}
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl
index ae156d7313..178deca8a2 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl
@@ -108,7 +108,7 @@ PSDepthOutput MainPS(VSDepthOutput IN, bool isFrontFace : SV_IsFrontFace)
float3 bitangents[UvSetCount] = { IN.m_bitangent.xyz, float3(0, 0, 0) };
PrepareGeneratedTangent(IN.m_normal, IN.m_worldPosition, isFrontFace, IN.m_uv, UvSetCount, tangents, bitangents, 1);
- GetDepth_Setup(IN.m_blendMask);
+ s_blendMaskFromVertexStream = IN.m_blendMask;
float depth;
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
index a83ea629e4..a690c0569a 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
@@ -134,6 +134,8 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
{
depth = IN.m_position.z;
+ s_blendMaskFromVertexStream = IN.m_blendMask;
+
// ------- Tangents & Bitangets -------
// We support two UV streams, but only a single stream of tangent/bitangent. So for UV[1+] we generated the tangent/bitangent in screen-space.
@@ -156,15 +158,14 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// ------- Debug Modes -------
- if(o_debugDrawMode == DebugDrawMode::BlendMaskValues)
+ if(o_debugDrawMode == DebugDrawMode::BlendSource)
{
- float3 blendMaskValues = GetBlendMaskValues(IN.m_uv[MaterialSrg::m_blendMaskUvIndex], IN.m_blendMask);
- return DebugOutput(blendMaskValues);
+ float3 blendSource = GetBlendSourceValues(IN.m_uv[MaterialSrg::m_blendMaskUvIndex]);
+ return DebugOutput(blendSource);
}
if(o_debugDrawMode == DebugDrawMode::DepthMaps)
{
- GetDepth_Setup(IN.m_blendMask);
float depth = GetNormalizedDepth(-MaterialSrg::m_displacementMax, -MaterialSrg::m_displacementMin, IN.m_uv[MaterialSrg::m_parallaxUvIndex], float2(0,0), float2(0,0));
return DebugOutput(float3(depth,depth,depth));
}
@@ -176,8 +177,6 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// Parallax mapping's non uniform uv transformations break screen space subsurface scattering, disable it when subsurface scatteirng is enabled
if(ShouldHandleParallax())
{
- GetDepth_Setup(IN.m_blendMask);
-
float3x3 uvMatrix = MaterialSrg::m_parallaxUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3();
float3x3 uvMatrixInverse = MaterialSrg::m_parallaxUvIndex == 0 ? MaterialSrg::m_uvMatrixInverse : CreateIdentity3x3();
@@ -218,13 +217,13 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// ------- Calculate Layer Blend Mask Values -------
// Now that any parallax has been calculated, we calculate the blend factors for any layers that are impacted by the parallax.
- float3 blendMaskValues = GetBlendMaskValues(IN.m_uv[MaterialSrg::m_blendMaskUvIndex], IN.m_blendMask);
+ float3 blendWeights = GetBlendWeights(IN.m_uv[MaterialSrg::m_blendMaskUvIndex]);
// ------- Normal -------
- float3 layer1_normalFactor = MaterialSrg::m_layer1_m_normalFactor * blendMaskValues.r;
- float3 layer2_normalFactor = MaterialSrg::m_layer2_m_normalFactor * blendMaskValues.g;
- float3 layer3_normalFactor = MaterialSrg::m_layer3_m_normalFactor * blendMaskValues.b;
+ float3 layer1_normalFactor = MaterialSrg::m_layer1_m_normalFactor * blendWeights.r;
+ float3 layer2_normalFactor = MaterialSrg::m_layer2_m_normalFactor * blendWeights.g;
+ float3 layer3_normalFactor = MaterialSrg::m_layer3_m_normalFactor * blendWeights.b;
float3x3 layer1_uvMatrix = MaterialSrg::m_layer1_m_normalMapUvIndex == 0 ? MaterialSrg::m_layer1_m_uvMatrix : CreateIdentity3x3();
float3x3 layer2_uvMatrix = MaterialSrg::m_layer2_m_normalMapUvIndex == 0 ? MaterialSrg::m_layer2_m_uvMatrix : CreateIdentity3x3();
float3x3 layer3_uvMatrix = MaterialSrg::m_layer3_m_normalMapUvIndex == 0 ? MaterialSrg::m_layer3_m_uvMatrix : CreateIdentity3x3();
@@ -249,7 +248,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
float3 layer1_baseColor = BlendBaseColor(layer1_sampledColor, MaterialSrg::m_layer1_m_baseColor.rgb, MaterialSrg::m_layer1_m_baseColorFactor, o_layer1_o_baseColorTextureBlendMode, o_layer1_o_baseColor_useTexture);
float3 layer2_baseColor = BlendBaseColor(layer2_sampledColor, MaterialSrg::m_layer2_m_baseColor.rgb, MaterialSrg::m_layer2_m_baseColorFactor, o_layer2_o_baseColorTextureBlendMode, o_layer2_o_baseColor_useTexture);
float3 layer3_baseColor = BlendBaseColor(layer3_sampledColor, MaterialSrg::m_layer3_m_baseColor.rgb, MaterialSrg::m_layer3_m_baseColorFactor, o_layer3_o_baseColorTextureBlendMode, o_layer3_o_baseColor_useTexture);
- float3 baseColor = BlendLayers(layer1_baseColor, layer2_baseColor, layer3_baseColor, blendMaskValues);
+ float3 baseColor = BlendLayers(layer1_baseColor, layer2_baseColor, layer3_baseColor, blendWeights);
if(o_parallax_highlightClipping && displacementIsClipped)
{
@@ -264,7 +263,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
float layer1_metallic = GetMetallicInput(MaterialSrg::m_layer1_m_metallicMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_metallicMapUvIndex], MaterialSrg::m_layer1_m_metallicFactor, o_layer1_o_metallic_useTexture);
float layer2_metallic = GetMetallicInput(MaterialSrg::m_layer2_m_metallicMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_metallicMapUvIndex], MaterialSrg::m_layer2_m_metallicFactor, o_layer2_o_metallic_useTexture);
float layer3_metallic = GetMetallicInput(MaterialSrg::m_layer3_m_metallicMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_metallicMapUvIndex], MaterialSrg::m_layer3_m_metallicFactor, o_layer3_o_metallic_useTexture);
- metallic = BlendLayers(layer1_metallic, layer2_metallic, layer3_metallic, blendMaskValues);
+ metallic = BlendLayers(layer1_metallic, layer2_metallic, layer3_metallic, blendWeights);
}
// ------- Specular -------
@@ -272,7 +271,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
float layer1_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer1_m_specularF0Map, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_specularF0MapUvIndex], MaterialSrg::m_layer1_m_specularF0Factor, o_layer1_o_specularF0_useTexture);
float layer2_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer2_m_specularF0Map, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_specularF0MapUvIndex], MaterialSrg::m_layer2_m_specularF0Factor, o_layer2_o_specularF0_useTexture);
float layer3_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer3_m_specularF0Map, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_specularF0MapUvIndex], MaterialSrg::m_layer3_m_specularF0Factor, o_layer3_o_specularF0_useTexture);
- float specularF0Factor = BlendLayers(layer1_specularF0Factor, layer2_specularF0Factor, layer3_specularF0Factor, blendMaskValues);
+ float specularF0Factor = BlendLayers(layer1_specularF0Factor, layer2_specularF0Factor, layer3_specularF0Factor, blendWeights);
surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic);
@@ -281,7 +280,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
float layer1_roughness = GetRoughnessInput(MaterialSrg::m_layer1_m_roughnessMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_roughnessMapUvIndex], MaterialSrg::m_layer1_m_roughnessFactor, MaterialSrg::m_layer1_m_roughnessLowerBound, MaterialSrg::m_layer1_m_roughnessUpperBound, o_layer1_o_roughness_useTexture);
float layer2_roughness = GetRoughnessInput(MaterialSrg::m_layer2_m_roughnessMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_roughnessMapUvIndex], MaterialSrg::m_layer2_m_roughnessFactor, MaterialSrg::m_layer2_m_roughnessLowerBound, MaterialSrg::m_layer2_m_roughnessUpperBound, o_layer2_o_roughness_useTexture);
float layer3_roughness = GetRoughnessInput(MaterialSrg::m_layer3_m_roughnessMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_roughnessMapUvIndex], MaterialSrg::m_layer3_m_roughnessFactor, MaterialSrg::m_layer3_m_roughnessLowerBound, MaterialSrg::m_layer3_m_roughnessUpperBound, o_layer3_o_roughness_useTexture);
- surface.roughnessLinear = BlendLayers(layer1_roughness, layer2_roughness, layer3_roughness, blendMaskValues);
+ surface.roughnessLinear = BlendLayers(layer1_roughness, layer2_roughness, layer3_roughness, blendWeights);
surface.CalculateRoughnessA();
@@ -314,19 +313,19 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
float3 layer1_emissive = GetEmissiveInput(MaterialSrg::m_layer1_m_emissiveMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_emissiveMapUvIndex], MaterialSrg::m_layer1_m_emissiveIntensity, MaterialSrg::m_layer1_m_emissiveColor.rgb, o_layer1_o_emissiveEnabled, o_layer1_o_emissive_useTexture);
float3 layer2_emissive = GetEmissiveInput(MaterialSrg::m_layer2_m_emissiveMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_emissiveMapUvIndex], MaterialSrg::m_layer2_m_emissiveIntensity, MaterialSrg::m_layer2_m_emissiveColor.rgb, o_layer2_o_emissiveEnabled, o_layer2_o_emissive_useTexture);
float3 layer3_emissive = GetEmissiveInput(MaterialSrg::m_layer3_m_emissiveMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_emissiveMapUvIndex], MaterialSrg::m_layer3_m_emissiveIntensity, MaterialSrg::m_layer3_m_emissiveColor.rgb, o_layer3_o_emissiveEnabled, o_layer3_o_emissive_useTexture);
- lightingData.emissiveLighting = BlendLayers(layer1_emissive, layer2_emissive, layer3_emissive, blendMaskValues);
+ lightingData.emissiveLighting = BlendLayers(layer1_emissive, layer2_emissive, layer3_emissive, blendWeights);
// ------- Occlusion -------
float layer1_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer1_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer1_m_diffuseOcclusionFactor, o_layer1_o_diffuseOcclusion_useTexture);
float layer2_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer2_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer2_m_diffuseOcclusionFactor, o_layer2_o_diffuseOcclusion_useTexture);
float layer3_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer3_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer3_m_diffuseOcclusionFactor, o_layer3_o_diffuseOcclusion_useTexture);
- lightingData.diffuseAmbientOcclusion = BlendLayers(layer1_diffuseAmbientOcclusion, layer2_diffuseAmbientOcclusion, layer3_diffuseAmbientOcclusion, blendMaskValues);
+ lightingData.diffuseAmbientOcclusion = BlendLayers(layer1_diffuseAmbientOcclusion, layer2_diffuseAmbientOcclusion, layer3_diffuseAmbientOcclusion, blendWeights);
float layer1_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer1_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer1_m_specularOcclusionFactor, o_layer1_o_specularOcclusion_useTexture);
float layer2_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer2_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer2_m_specularOcclusionFactor, o_layer2_o_specularOcclusion_useTexture);
float layer3_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer3_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer3_m_specularOcclusionFactor, o_layer3_o_specularOcclusion_useTexture);
- lightingData.specularOcclusion = BlendLayers(layer1_specularOcclusion, layer2_specularOcclusion, layer3_specularOcclusion, blendMaskValues);
+ lightingData.specularOcclusion = BlendLayers(layer1_specularOcclusion, layer2_specularOcclusion, layer3_specularOcclusion, blendWeights);
// ------- Clearcoat -------
@@ -385,11 +384,11 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// --- Blend Layers ---
- surface.clearCoat.factor = BlendLayers(layer1_clearCoatFactor, layer2_clearCoatFactor, layer3_clearCoatFactor, blendMaskValues);
- surface.clearCoat.roughness = BlendLayers(layer1_clearCoatRoughness, layer2_clearCoatRoughness, layer3_clearCoatRoughness, blendMaskValues);
+ surface.clearCoat.factor = BlendLayers(layer1_clearCoatFactor, layer2_clearCoatFactor, layer3_clearCoatFactor, blendWeights);
+ surface.clearCoat.roughness = BlendLayers(layer1_clearCoatRoughness, layer2_clearCoatRoughness, layer3_clearCoatRoughness, blendWeights);
// [GFX TODO][ATOM-14592] This is not the right way to blend the normals. We need to use ReorientTangentSpaceNormal(), and that requires GetClearCoatInputs() to return the normal in TS instead of WS.
- surface.clearCoat.normal = BlendLayers(layer1_clearCoatNormal, layer2_clearCoatNormal, layer3_clearCoatNormal, blendMaskValues);
+ surface.clearCoat.normal = BlendLayers(layer1_clearCoatNormal, layer2_clearCoatNormal, layer3_clearCoatNormal, blendWeights);
surface.clearCoat.normal = normalize(surface.clearCoat.normal);
// manipulate base layer f0 if clear coat is enabled
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl
index 325937b228..2ab4c50841 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl
@@ -107,7 +107,7 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace)
float3 bitangents[UvSetCount] = { IN.m_bitangent.xyz, float3(0, 0, 0) };
PrepareGeneratedTangent(IN.m_normal, IN.m_worldPosition, isFrontFace, IN.m_uv, UvSetCount, tangents, bitangents, 1);
- GetDepth_Setup(IN.m_blendMask);
+ s_blendMaskFromVertexStream = IN.m_blendMask;
float depth;
diff --git a/Gems/Atom/Feature/Common/Assets/Textures/DefaultBlendMask_layers.png b/Gems/Atom/Feature/Common/Assets/Textures/DefaultBlendMask_layers.png
index d1606516af..5e60261dd7 100644
--- a/Gems/Atom/Feature/Common/Assets/Textures/DefaultBlendMask_layers.png
+++ b/Gems/Atom/Feature/Common/Assets/Textures/DefaultBlendMask_layers.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f74ffab6ee15906158d27cbd2e5556e8fcdfd7820c0d0fd4b403de8a7af81662
-size 5651
+oid sha256:6660fa05dbf1e90298472fb41d99fff80a80de64ee88d17af4d0df3bdafb1ff6
+size 52877
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material
index b2a3eac890..b85705fcb8 100644
--- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material
@@ -134,8 +134,14 @@
"enable": true
},
"uv": {
- "offsetU": -0.2800000011920929,
- "rotateDegrees": 39.599998474121097
+ "center": [
+ 0.10000000149011612,
+ 0.20000000298023225
+ ],
+ "offsetU": 0.23000000417232514,
+ "offsetV": -0.23999999463558198,
+ "rotateDegrees": 39.599998474121097,
+ "scale": 1.100000023841858
}
}
-}
+}
\ No newline at end of file
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material
index e7903a8c91..f6c881aee5 100644
--- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material
@@ -30,6 +30,7 @@
"layer2_parallax": {
"enable": true,
"factor": 0.05299999937415123,
+ "offset": -0.024000000208616258,
"textureMap": "TestData/Textures/cc0/Rock030_2K_Displacement.jpg"
},
"layer2_roughness": {
@@ -49,4 +50,4 @@
"pdo": true
}
}
-}
+}
\ No newline at end of file
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendSource.material
similarity index 86%
rename from Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material
rename to Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendSource.material
index 94a1ec6a30..cdd21212c9 100644
--- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendSource.material
@@ -5,7 +5,7 @@
"propertyLayoutVersion": 3,
"properties": {
"general": {
- "debugDrawMode": "BlendMaskValues"
+ "debugDrawMode": "BlendSource"
}
}
}
diff --git a/Gems/Atom/TestData/TestData/Objects/PaintedPlane.fbx b/Gems/Atom/TestData/TestData/Objects/PaintedPlane.fbx
new file mode 100644
index 0000000000..be30ca4639
--- /dev/null
+++ b/Gems/Atom/TestData/TestData/Objects/PaintedPlane.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:053a7cd73b37c815900f87abd524830e6f23eee75d3b72fb866e86498d528159
+size 36156
From 7276253c4225dd09dc0208693815abffe7ac672c Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Tue, 11 May 2021 08:20:44 +0100
Subject: [PATCH 010/132] renamed function
---
.../AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp | 4 ++--
.../AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
index faeae0a06d..85784d61e0 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
@@ -126,7 +126,7 @@ namespace AzToolsFramework
{
QStylePainter p(this);
- if (IsSectionSeparator())
+ if (IsReorderableRow())
{
const QPen linePen(QColor(0x3B3E3F));
p.setPen(linePen);
@@ -1332,7 +1332,7 @@ namespace AzToolsFramework
return canBeTopLevel(this);
}
- bool PropertyRowWidget::IsSectionSeparator() const
+ bool PropertyRowWidget::IsReorderableRow() const
{
return CanBeReordered();
}
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index b6c94dc98b..58bf3bb9f0 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -83,7 +83,7 @@ namespace AzToolsFramework
PropertyRowWidget* GetParentRow() const { return m_parentRow; }
int GetLevel() const;
bool IsTopLevel() const;
- bool IsSectionSeparator() const;
+ bool IsReorderableRow() const;
// Remove the default label and append the text to the name label.
bool GetAppendDefaultLabelToName();
From b08643d9da90d0215ed5b22efcc3716fdaa90622 Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Tue, 11 May 2021 11:24:51 +0100
Subject: [PATCH 011/132] Use renamed functions in stylesheet.
---
.../AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx | 2 +-
Code/Sandbox/Editor/Style/Editor.qss | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index 58bf3bb9f0..1c17cab69f 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -44,7 +44,7 @@ namespace AzToolsFramework
Q_PROPERTY(bool hasChildRows READ HasChildRows);
Q_PROPERTY(bool isTopLevel READ IsTopLevel);
Q_PROPERTY(int getLevel READ GetLevel);
- Q_PROPERTY(bool isSectionSeparator READ IsSectionSeparator);
+ Q_PROPERTY(bool canBeReordered READ CanBeReordered);
Q_PROPERTY(bool appendDefaultLabelToName READ GetAppendDefaultLabelToName WRITE AppendDefaultLabelToName)
public:
AZ_CLASS_ALLOCATOR(PropertyRowWidget, AZ::SystemAllocator, 0)
diff --git a/Code/Sandbox/Editor/Style/Editor.qss b/Code/Sandbox/Editor/Style/Editor.qss
index 7887560105..fa7d67dd43 100644
--- a/Code/Sandbox/Editor/Style/Editor.qss
+++ b/Code/Sandbox/Editor/Style/Editor.qss
@@ -38,7 +38,7 @@ AzToolsFramework--ComponentPaletteWidget > QTreeView
background-color: #222222;
}
-AzToolsFramework--PropertyRowWidget[isSectionSeparator="true"] QLabel#Name
+AzToolsFramework--PropertyRowWidget[canBeReordered="true"] QLabel#Name
{
font-weight: bold;
}
From 9faf35b529d942dffe1b9fce7d9310be8de9edf8 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Tue, 11 May 2021 17:09:41 -0700
Subject: [PATCH 012/132] Refactor in prepration for ATOM-14688 "Disable
Individual Layers"
Refactored StandardMultilayerPBR to collate all the code for each layer into a couple structs and utility functions. This makes the code easier to maintain, and in particular will make it easy for me to add Enable flags for the layers in a subsequent commit.
Also removed subsurface scattering and translucency from StandardMultilayerPBR, according to ATOM-4120 "Stabilize Standard PBR Regarding Subsurface and Translucency".
Squashed commit of the following:
commit a6052d6ad4f70183d0ce72e84c7dc5512dc24d5e
Author: Chris Santora
Date: Tue May 11 16:32:15 2021 -0700
Got the refactor finally working. I had change it to blend the baseColor, spec factor, and metalness before converting to albedo and spec, in order to get exactly the same results as before.
commit 42d6da7f405097dea07b6ed0426d6a662b61440d
Author: Chris Santora
Date: Tue May 11 15:58:38 2021 -0700
Fixed clear coat issue due to LightingData initialized too late.
commit 358194a5caf6f9eb99b0e5345ad5f7768b244a93
Author: Chris Santora
Date: Tue May 11 15:18:30 2021 -0700
Fixed a couple issues.
commit adb431f8113b945057959db288a7ee2dd825dd69
Author: Chris Santora
Date: Tue May 11 12:42:12 2021 -0700
WIP refactor of StandardMultilayerPBR to collate the code for each layer. Also removed subsurface scattering from multilayer.
---
.../Types/StandardMultilayerPBR.materialtype | 207 ---------
.../Types/StandardMultilayerPBR_Common.azsli | 18 -
.../StandardMultilayerPBR_ForwardPass.azsl | 398 ++++++++++--------
.../PBR/Surfaces/StandardSurface.azsli | 14 +
4 files changed, 244 insertions(+), 393 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
index 3e95846b6e..90a599c6f9 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
@@ -23,11 +23,6 @@
"displayName": "UVs",
"description": "Properties for configuring UV transforms for the entire material, including the blend masks."
},
- {
- "id": "subsurfaceScattering",
- "displayName": "Subsurface Scattering",
- "description": "Properties for configuring subsurface scattering effects."
- },
{
// Note: this property group is used in the DiffuseGlobalIllumination pass, it is not read by the StandardPBR shader
"id": "irradiance",
@@ -467,183 +462,6 @@
"step": 0.1
}
],
- "subsurfaceScattering": [
- {
- "id": "enableSubsurfaceScattering",
- "displayName": "Subsurface Scattering",
- "description": "Enable subsurface scattering feature, this will disable metallic and parallax mapping property due to incompatibility",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "id": "o_enableSubsurfaceScattering"
- }
- },
- {
- "id": "subsurfaceScatterFactor",
- "displayName": " Factor",
- "description": "Strength factor for scaling percentage of subsurface scattering effect applied",
- "type": "float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "id": "m_subsurfaceScatteringFactor"
- }
- },
- {
- "id": "influenceMap",
- "displayName": " Influence Map",
- "description": "Use texture map to control the strength of subsurface scattering",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "id": "m_subsurfaceScatteringInfluenceMap"
- }
- },
- {
- "id": "useInfluenceMap",
- "displayName": " Use Influence Map",
- "description": "Whether to use the texture map as influence mask.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "id": "influenceMapUv",
- "displayName": " UV",
- "description": "Influence map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "id": "m_subsurfaceScatteringInfluenceMapUvIndex"
- }
- },
- {
- "id": "scatterColor",
- "displayName": " Scatter color",
- "description": "Color of volume light traveled through",
- "type": "Color",
- "defaultValue": [ 1.0, 0.27, 0.13 ]
- },
- {
- "id": "scatterDistance",
- "displayName": " Scatter distance",
- "description": "How far light traveled inside the volume",
- "type": "float",
- "defaultValue": 8,
- "min": 0.0,
- "softMax": 20.0
- },
- {
- "id": "quality",
- "displayName": " Quality",
- "description": "How much percent of sample will be used for each pixel, more samples improve quality and reduce artifacts, especially when the scatter distance is relatively large, but slow down computation time, 1.0 = full set 200 samples per pixel",
- "type": "float",
- "defaultValue": 0.4,
- "min": 0.2,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "id": "m_subsurfaceScatteringQuality"
- }
- },
- {
- "id": "transmissionMode",
- "displayName": "Transmission",
- "description": "Algorithm used for calculating transmission",
- "type": "Enum",
- "enumValues": [ "None", "ThickObject", "ThinObject" ],
- "defaultValue": "None",
- "connection": {
- "type": "ShaderOption",
- "id": "o_transmission_mode"
- }
- },
- {
- "id": "thickness",
- "displayName": " Thickness",
- "description": "Normalized global thickness, the maxima between this value (multiplied by thickness map if enabled) and thickness from shadow map (if applicable) will be used as final thickness of pixel",
- "type": "float",
- "defaultValue": 0.5,
- "min": 0.0,
- "max": 1.0
- },
- {
- "id": "thicknessMap",
- "displayName": " Thickness Map",
- "description": "Use a greyscale texture for per pixel thickness",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "id": "m_transmissionThicknessMap"
- }
- },
- {
- "id": "useThicknessMap",
- "displayName": " Use Thickness Map",
- "description": "Whether to use the thickness map",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "id": "thicknessMapUv",
- "displayName": " UV",
- "description": "Thickness map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "id": "m_transmissionThicknessMapUvIndex"
- }
- },
- {
- "id": "transmissionTint",
- "displayName": " Transmission Tint",
- "description": "Color of the volume light travelling through",
- "type": "Color",
- "defaultValue": [ 1.0, 0.8, 0.6 ]
- },
- {
- "id": "transmissionPower",
- "displayName": " Power",
- "description": "How much transmitted light scatter radially ",
- "type": "float",
- "defaultValue": 6.0,
- "min": 0.0,
- "softMax": 20.0
- },
- {
- "id": "transmissionDistortion",
- "displayName": " Distortion",
- "description": "How much light direction distorted towards surface normal",
- "type": "float",
- "defaultValue": 0.1,
- "min": 0.0,
- "max": 1.0
- },
- {
- "id": "transmissionAttenuation",
- "displayName": " Attenuation",
- "description": "How fast transmitted light fade with thickness",
- "type": "float",
- "defaultValue": 4.0,
- "min": 0.0,
- "softMax": 20.0
- },
- {
- "id": "transmissionScale",
- "displayName": " Scale",
- "description": "Strength of transmission",
- "type": "float",
- "defaultValue": 3.0,
- "min": 0.0,
- "softMax": 20.0
- }
- ],
"irradiance": [
// Note: this property group is used in the DiffuseGlobalIllumination pass, it is not read by the StandardPBR shader
{
@@ -2844,25 +2662,6 @@
"file": "StandardMultilayerPBR_ShaderEnable.lua"
}
},
- {
- // Preprocess & build parameter set for subsurface scattering and translucency
- "type": "HandleSubsurfaceScatteringParameters",
- "args": {
- "mode": "subsurfaceScattering.transmissionMode",
- "scale" : "subsurfaceScattering.transmissionScale",
- "power" : "subsurfaceScattering.transmissionPower",
- "distortion" : "subsurfaceScattering.transmissionDistortion",
- "attenuation" : "subsurfaceScattering.transmissionAttenuation",
- "tintColor" : "subsurfaceScattering.transmissionTint",
- "thickness" : "subsurfaceScattering.thickness",
- "enabled": "subsurfaceScattering.enableSubsurfaceScattering",
- "scatterDistanceColor" : "subsurfaceScattering.scatterColor",
- "scatterDistanceIntensity" : "subsurfaceScattering.scatterDistance",
- "scatterDistanceShaderInput" : "m_scatterDistance",
- "parametersShaderInput" : "m_transmissionParams",
- "tintThickenssShaderInput" : "m_transmissionTintThickness"
- }
- },
{
"type": "Lua",
"args": {
@@ -2875,12 +2674,6 @@
"file": "StandardMultilayerPBR_Parallax.lua"
}
},
- {
- "type": "Lua",
- "args": {
- "file": "StandardPBR_SubsurfaceState.lua"
- }
- },
//##############################################################################################
// Layer 1 Functors
//##############################################################################################
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
index f1f6d90e14..8c7b49214b 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
@@ -91,24 +91,6 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial
MipFilter = Linear;
};
- // Parameters for subsurface scattering
- float m_subsurfaceScatteringFactor;
- float m_subsurfaceScatteringQuality;
- float3 m_scatterDistance;
- Texture2D m_subsurfaceScatteringInfluenceMap;
- uint m_subsurfaceScatteringInfluenceMapUvIndex;
-
- // Parameters for transmission
-
- // Elements of m_transmissionParams:
- // Thick object mode: (attenuation coefficient, power, distortion, scale)
- // Thin object mode: (float3 scatter distance, scale)
- float4 m_transmissionParams;
-
- // (float3 TintColor, thickness)
- float4 m_transmissionTintThickness;
- Texture2D m_transmissionThicknessMap;
- uint m_transmissionThicknessMapUvIndex;
}
// ------ Shader Options ----------------------------------------
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
index a690c0569a..9e5a2e623a 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
@@ -55,7 +55,6 @@ DEFINE_LAYER_OPTIONS(o_layer1_)
DEFINE_LAYER_OPTIONS(o_layer2_)
DEFINE_LAYER_OPTIONS(o_layer3_)
-#include "MaterialInputs/SubsurfaceInput.azsli"
#include "MaterialInputs/TransmissionInput.azsli"
#include "StandardMultilayerPBR_Common.azsli"
@@ -127,6 +126,181 @@ VSOutput ForwardPassVS(VSInput IN)
return OUT;
}
+//! Collects all the raw Standard material inputs for a single layer. See ProcessStandardMaterialInputs().
+struct StandardMaterialInputs
+{
+ COMMON_SRG_INPUTS_BASE_COLOR()
+ COMMON_SRG_INPUTS_ROUGHNESS()
+ COMMON_SRG_INPUTS_METALLIC()
+ COMMON_SRG_INPUTS_SPECULAR_F0()
+ COMMON_SRG_INPUTS_NORMAL()
+ COMMON_SRG_INPUTS_CLEAR_COAT()
+ COMMON_SRG_INPUTS_OCCLUSION()
+ COMMON_SRG_INPUTS_EMISSIVE()
+ // Note parallax is omitted here because that requires special handling.
+
+ bool m_normal_useTexture;
+ bool m_baseColor_useTexture;
+ bool m_metallic_useTexture;
+ bool m_specularF0_useTexture;
+ bool m_roughness_useTexture;
+ bool m_emissiveEnabled;
+ bool m_emissive_useTexture;
+ bool m_diffuseOcclusion_useTexture;
+ bool m_specularOcclusion_useTexture;
+ bool m_clearCoatEnabled;
+ bool m_clearCoat_factor_useTexture;
+ bool m_clearCoat_roughness_useTexture;
+ bool m_clearCoat_normal_useTexture;
+
+ TextureBlendMode m_baseColorTextureBlendMode;
+
+ float2 m_vertexUv[UvSetCount];
+ float3x3 m_uvMatrix;
+ float m_normal;
+ float3 m_tangents[UvSetCount];
+ float3 m_bitangents[UvSetCount];
+
+ sampler m_sampler;
+
+ bool m_isFrontFace;
+};
+
+//! Holds the final processed material inputs, after all flags have been checked, textures have been sampled, factors have been applied, etc.
+//! This data is ready to be copied into a Surface and/or LightingData struct for the lighting system to consume.
+class ProcessedMaterialInputs
+{
+ float3 m_normalTS; //!< Normal in tangent-space
+ float3 m_baseColor;
+ float3 m_specularF0Factor;
+ float m_metallic;
+ float m_roughness;
+ float3 m_emissiveLighting;
+ float m_diffuseAmbientOcclusion;
+ float m_specularOcclusion;
+ ClearCoatSurfaceData m_clearCoat;
+
+ void InitializeToZero()
+ {
+ m_normalTS = float3(0,0,0);
+ m_baseColor = float3(0,0,0);
+ m_specularF0Factor = float3(0,0,0);
+ m_metallic = 0.0f;
+ m_roughness = 0.0f;
+ m_emissiveLighting = float3(0,0,0);
+ m_diffuseAmbientOcclusion = 0;
+ m_specularOcclusion = 0;
+ m_clearCoat.InitializeToZero();
+ }
+};
+
+//! Processes the set of Standard material inputs for a single layer.
+//! The FILL_STANDARD_MATERIAL_INPUTS() macro below can be used to fill the StandardMaterialInputs struct.
+ProcessedMaterialInputs ProcessStandardMaterialInputs(StandardMaterialInputs inputs)
+{
+ ProcessedMaterialInputs result;
+
+ float2 transformedUv[UvSetCount];
+ transformedUv[0] = mul(inputs.m_uvMatrix, float3(inputs.m_vertexUv[0], 1.0)).xy;
+ transformedUv[1] = inputs.m_vertexUv[1];
+
+ float3x3 normalUvMatrix = inputs.m_normalMapUvIndex == 0 ? inputs.m_uvMatrix : CreateIdentity3x3();
+ result.m_normalTS = GetNormalInputTS(inputs.m_normalMap, inputs.m_sampler, transformedUv[inputs.m_normalMapUvIndex], inputs.m_flipNormalX, inputs.m_flipNormalY, normalUvMatrix, inputs.m_normal_useTexture, inputs.m_normalFactor);
+
+ float3 sampledBaseColor = GetBaseColorInput(inputs.m_baseColorMap, inputs.m_sampler, transformedUv[inputs.m_baseColorMapUvIndex], inputs.m_baseColor.rgb, inputs.m_baseColor_useTexture);
+ result.m_baseColor = BlendBaseColor(sampledBaseColor, inputs.m_baseColor.rgb, inputs.m_baseColorFactor, inputs.m_baseColorTextureBlendMode, inputs.m_baseColor_useTexture);
+ result.m_specularF0Factor = GetSpecularInput(inputs.m_specularF0Map, inputs.m_sampler, transformedUv[inputs.m_specularF0MapUvIndex], inputs.m_specularF0Factor, inputs.m_specularF0_useTexture);
+ result.m_metallic = GetMetallicInput(inputs.m_metallicMap, inputs.m_sampler, transformedUv[inputs.m_metallicMapUvIndex], inputs.m_metallicFactor, inputs.m_metallic_useTexture);
+ result.m_roughness = GetRoughnessInput(inputs.m_roughnessMap, MaterialSrg::m_sampler, transformedUv[inputs.m_roughnessMapUvIndex], inputs.m_roughnessFactor, inputs.m_roughnessLowerBound, inputs.m_roughnessUpperBound, inputs.m_roughness_useTexture);
+
+ result.m_emissiveLighting = GetEmissiveInput(inputs.m_emissiveMap, inputs.m_sampler, transformedUv[inputs.m_emissiveMapUvIndex], inputs.m_emissiveIntensity, inputs.m_emissiveColor.rgb, inputs.m_emissiveEnabled, inputs.m_emissive_useTexture);
+ result.m_diffuseAmbientOcclusion = GetOcclusionInput(inputs.m_diffuseOcclusionMap, inputs.m_sampler, transformedUv[inputs.m_diffuseOcclusionMapUvIndex], inputs.m_diffuseOcclusionFactor, inputs.m_diffuseOcclusion_useTexture);
+ result.m_specularOcclusion = GetOcclusionInput(inputs.m_specularOcclusionMap, MaterialSrg::m_sampler, transformedUv[inputs.m_specularOcclusionMapUvIndex], inputs.m_specularOcclusionFactor, inputs.m_specularOcclusion_useTexture);
+
+ result.m_clearCoat.InitializeToZero();
+ if(inputs.m_clearCoatEnabled)
+ {
+ float3x3 clearCoatUvMatrix = inputs.m_clearCoatNormalMapUvIndex == 0 ? inputs.m_uvMatrix : CreateIdentity3x3();
+
+ GetClearCoatInputs(inputs.m_clearCoatInfluenceMap, transformedUv[inputs.m_clearCoatInfluenceMapUvIndex], inputs.m_clearCoatFactor, inputs.m_clearCoat_factor_useTexture,
+ inputs.m_clearCoatRoughnessMap, transformedUv[inputs.m_clearCoatRoughnessMapUvIndex], inputs.m_clearCoatRoughness, inputs.m_clearCoat_roughness_useTexture,
+ inputs.m_clearCoatNormalMap, transformedUv[inputs.m_clearCoatNormalMapUvIndex], inputs.m_normal, inputs.m_clearCoat_normal_useTexture, inputs.m_clearCoatNormalStrength,
+ clearCoatUvMatrix, inputs.m_tangents[inputs.m_clearCoatNormalMapUvIndex], inputs.m_bitangents[inputs.m_clearCoatNormalMapUvIndex],
+ inputs.m_sampler, inputs.m_isFrontFace,
+ result.m_clearCoat.factor, result.m_clearCoat.roughness, result.m_clearCoat.normal);
+ }
+
+ return result;
+}
+
+//! Fills a StandardMaterialInputs struct with data from the MaterialSrg, shader options, and local vertex data.
+#define FILL_STANDARD_MATERIAL_INPUTS(inputs, srgLayerPrefix, optionsLayerPrefix, blendWeight) \
+ inputs.m_sampler = MaterialSrg::m_sampler; \
+ inputs.m_vertexUv = IN.m_uv; \
+ inputs.m_uvMatrix = srgLayerPrefix##m_uvMatrix; \
+ inputs.m_normal = IN.m_normal; \
+ inputs.m_tangents = tangents; \
+ inputs.m_bitangents = bitangents; \
+ inputs.m_isFrontFace = isFrontFace; \
+ \
+ inputs.m_normalMapUvIndex = srgLayerPrefix##m_normalMapUvIndex; \
+ inputs.m_normalMap = srgLayerPrefix##m_normalMap; \
+ inputs.m_flipNormalX = srgLayerPrefix##m_flipNormalX; \
+ inputs.m_flipNormalY = srgLayerPrefix##m_flipNormalY; \
+ inputs.m_normal_useTexture = optionsLayerPrefix##o_normal_useTexture; \
+ inputs.m_normalFactor = srgLayerPrefix##m_normalFactor * blendWeight; \
+ inputs.m_baseColorMap = srgLayerPrefix##m_baseColorMap; \
+ inputs.m_baseColorMapUvIndex = srgLayerPrefix##m_baseColorMapUvIndex; \
+ inputs.m_baseColor = srgLayerPrefix##m_baseColor; \
+ inputs.m_baseColor_useTexture = optionsLayerPrefix##o_baseColor_useTexture; \
+ inputs.m_baseColorFactor = srgLayerPrefix##m_baseColorFactor; \
+ inputs.m_baseColorTextureBlendMode = optionsLayerPrefix##o_baseColorTextureBlendMode; \
+ inputs.m_metallicMap = srgLayerPrefix##m_metallicMap; \
+ inputs.m_metallicMapUvIndex = srgLayerPrefix##m_metallicMapUvIndex; \
+ inputs.m_metallicFactor = srgLayerPrefix##m_metallicFactor; \
+ inputs.m_metallic_useTexture = optionsLayerPrefix##o_metallic_useTexture; \
+ inputs.m_specularF0Map = srgLayerPrefix##m_specularF0Map; \
+ inputs.m_specularF0MapUvIndex = srgLayerPrefix##m_specularF0MapUvIndex; \
+ inputs.m_specularF0Factor = srgLayerPrefix##m_specularF0Factor; \
+ inputs.m_specularF0_useTexture = optionsLayerPrefix##o_specularF0_useTexture; \
+ inputs.m_roughnessMap = srgLayerPrefix##m_roughnessMap; \
+ inputs.m_roughnessMapUvIndex = srgLayerPrefix##m_roughnessMapUvIndex; \
+ inputs.m_roughnessFactor = srgLayerPrefix##m_roughnessFactor; \
+ inputs.m_roughnessLowerBound = srgLayerPrefix##m_roughnessLowerBound; \
+ inputs.m_roughnessUpperBound = srgLayerPrefix##m_roughnessUpperBound; \
+ inputs.m_roughness_useTexture = optionsLayerPrefix##o_roughness_useTexture; \
+ \
+ inputs.m_emissiveMap = srgLayerPrefix##m_emissiveMap; \
+ inputs.m_emissiveMapUvIndex = srgLayerPrefix##m_emissiveMapUvIndex; \
+ inputs.m_emissiveIntensity = srgLayerPrefix##m_emissiveIntensity; \
+ inputs.m_emissiveColor = srgLayerPrefix##m_emissiveColor; \
+ inputs.m_emissiveEnabled = optionsLayerPrefix##o_emissiveEnabled; \
+ inputs.m_emissive_useTexture = optionsLayerPrefix##o_emissive_useTexture; \
+ \
+ inputs.m_diffuseOcclusionMap = srgLayerPrefix##m_diffuseOcclusionMap; \
+ inputs.m_diffuseOcclusionMapUvIndex = srgLayerPrefix##m_diffuseOcclusionMapUvIndex; \
+ inputs.m_diffuseOcclusionFactor = srgLayerPrefix##m_diffuseOcclusionFactor; \
+ inputs.m_diffuseOcclusion_useTexture = optionsLayerPrefix##o_diffuseOcclusion_useTexture; \
+ \
+ inputs.m_specularOcclusionMap = srgLayerPrefix##m_specularOcclusionMap; \
+ inputs.m_specularOcclusionMapUvIndex = srgLayerPrefix##m_specularOcclusionMapUvIndex; \
+ inputs.m_specularOcclusionFactor = srgLayerPrefix##m_specularOcclusionFactor; \
+ inputs.m_specularOcclusion_useTexture = optionsLayerPrefix##o_specularOcclusion_useTexture; \
+ \
+ inputs.m_clearCoatEnabled = o_clearCoat_feature_enabled && optionsLayerPrefix##o_clearCoat_enabled; \
+ inputs.m_clearCoatInfluenceMap = srgLayerPrefix##m_clearCoatInfluenceMap; \
+ inputs.m_clearCoatInfluenceMapUvIndex = srgLayerPrefix##m_clearCoatInfluenceMapUvIndex; \
+ inputs.m_clearCoatFactor = srgLayerPrefix##m_clearCoatFactor; \
+ inputs.m_clearCoat_factor_useTexture = optionsLayerPrefix##o_clearCoat_factor_useTexture; \
+ inputs.m_clearCoatRoughnessMap = srgLayerPrefix##m_clearCoatRoughnessMap; \
+ inputs.m_clearCoatRoughnessMapUvIndex = srgLayerPrefix##m_clearCoatRoughnessMapUvIndex; \
+ inputs.m_clearCoatRoughness = srgLayerPrefix##m_clearCoatRoughness; \
+ inputs.m_clearCoat_roughness_useTexture = optionsLayerPrefix##o_clearCoat_roughness_useTexture; \
+ inputs.m_clearCoatNormalMap = srgLayerPrefix##m_clearCoatNormalMap; \
+ inputs.m_clearCoatNormalMapUvIndex = srgLayerPrefix##m_clearCoatNormalMapUvIndex; \
+ inputs.m_clearCoat_normal_useTexture = optionsLayerPrefix##o_clearCoat_normal_useTexture; \
+ inputs.m_clearCoatNormalStrength = srgLayerPrefix##m_clearCoatNormalStrength;
+
// ---------- Pixel Shader ----------
@@ -174,7 +348,6 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
bool displacementIsClipped = false;
- // Parallax mapping's non uniform uv transformations break screen space subsurface scattering, disable it when subsurface scatteirng is enabled
if(ShouldHandleParallax())
{
float3x3 uvMatrix = MaterialSrg::m_parallaxUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3();
@@ -197,108 +370,70 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
}
}
- Surface surface;
- surface.position = IN.m_worldPosition;
-
- // ------- Setup the per-layer UV transforms -------
-
- float2 uvLayer1[UvSetCount];
- float2 uvLayer2[UvSetCount];
- float2 uvLayer3[UvSetCount];
-
- // Only UV0 will be applied transforms from each layer.
- uvLayer1[0] = mul(MaterialSrg::m_layer1_m_uvMatrix, float3(IN.m_uv[0], 1.0)).xy;
- uvLayer2[0] = mul(MaterialSrg::m_layer2_m_uvMatrix, float3(IN.m_uv[0], 1.0)).xy;
- uvLayer3[0] = mul(MaterialSrg::m_layer3_m_uvMatrix, float3(IN.m_uv[0], 1.0)).xy;
- uvLayer1[1] = IN.m_uv[1];
- uvLayer2[1] = IN.m_uv[1];
- uvLayer3[1] = IN.m_uv[1];
-
// ------- Calculate Layer Blend Mask Values -------
// Now that any parallax has been calculated, we calculate the blend factors for any layers that are impacted by the parallax.
float3 blendWeights = GetBlendWeights(IN.m_uv[MaterialSrg::m_blendMaskUvIndex]);
- // ------- Normal -------
+ // ------- Layer 1 (base layer) -----------
+
+ ProcessedMaterialInputs lightingInputLayer1;
+ {
+ StandardMaterialInputs inputs;
+ FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer1_, o_layer1_, blendWeights.r)
+ lightingInputLayer1 = ProcessStandardMaterialInputs(inputs);
+ }
- float3 layer1_normalFactor = MaterialSrg::m_layer1_m_normalFactor * blendWeights.r;
- float3 layer2_normalFactor = MaterialSrg::m_layer2_m_normalFactor * blendWeights.g;
- float3 layer3_normalFactor = MaterialSrg::m_layer3_m_normalFactor * blendWeights.b;
- float3x3 layer1_uvMatrix = MaterialSrg::m_layer1_m_normalMapUvIndex == 0 ? MaterialSrg::m_layer1_m_uvMatrix : CreateIdentity3x3();
- float3x3 layer2_uvMatrix = MaterialSrg::m_layer2_m_normalMapUvIndex == 0 ? MaterialSrg::m_layer2_m_uvMatrix : CreateIdentity3x3();
- float3x3 layer3_uvMatrix = MaterialSrg::m_layer3_m_normalMapUvIndex == 0 ? MaterialSrg::m_layer3_m_uvMatrix : CreateIdentity3x3();
- float3 layer1_normalTS = GetNormalInputTS(MaterialSrg::m_layer1_m_normalMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_normalMapUvIndex], MaterialSrg::m_layer1_m_flipNormalX, MaterialSrg::m_layer1_m_flipNormalY, layer1_uvMatrix, o_layer1_o_normal_useTexture, layer1_normalFactor);
- float3 layer2_normalTS = GetNormalInputTS(MaterialSrg::m_layer2_m_normalMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_normalMapUvIndex], MaterialSrg::m_layer2_m_flipNormalX, MaterialSrg::m_layer2_m_flipNormalY, layer2_uvMatrix, o_layer2_o_normal_useTexture, layer2_normalFactor);
- float3 layer3_normalTS = GetNormalInputTS(MaterialSrg::m_layer3_m_normalMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_normalMapUvIndex], MaterialSrg::m_layer3_m_flipNormalX, MaterialSrg::m_layer3_m_flipNormalY, layer3_uvMatrix, o_layer3_o_normal_useTexture, layer3_normalFactor);
+ // ----------- Layer 2 -----------
+
+ ProcessedMaterialInputs lightingInputLayer2;
+ {
+ StandardMaterialInputs inputs;
+ FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer2_, o_layer2_, blendWeights.g)
+ lightingInputLayer2 = ProcessStandardMaterialInputs(inputs);
+ }
- float3 normalTS = ReorientTangentSpaceNormal(layer1_normalTS, layer2_normalTS);
- normalTS = ReorientTangentSpaceNormal(normalTS, layer3_normalTS);
+ // ----------- Layer 3 -----------
+
+ ProcessedMaterialInputs lightingInputLayer3;
+ {
+ StandardMaterialInputs inputs;
+ FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer3_, o_layer3_, blendWeights.b)
+ lightingInputLayer3 = ProcessStandardMaterialInputs(inputs);
+ }
+
+ // ------- Combine all layers ---------
+
+ Surface surface;
+ surface.position = IN.m_worldPosition;
+ surface.transmission.InitializeToZero();
+
+ // ------- Combine Normals ---------
+
+ float3 normalTS = lightingInputLayer1.m_normalTS;
+ normalTS = ReorientTangentSpaceNormal(normalTS, lightingInputLayer2.m_normalTS);
+ normalTS = ReorientTangentSpaceNormal(normalTS, lightingInputLayer3.m_normalTS);
// [GFX TODO][ATOM-14591]: This will only work if the normal maps all use the same UV stream. We would need to add support for having them in different UV streams.
surface.normal = normalize(TangentSpaceToWorld(normalTS, IN.m_normal, tangents[MaterialSrg::m_parallaxUvIndex], bitangents[MaterialSrg::m_parallaxUvIndex]));
-
- // ------- Base Color -------
-
- float2 layer1_baseColorUv = uvLayer1[MaterialSrg::m_layer1_m_baseColorMapUvIndex];
- float2 layer2_baseColorUv = uvLayer2[MaterialSrg::m_layer2_m_baseColorMapUvIndex];
- float2 layer3_baseColorUv = uvLayer3[MaterialSrg::m_layer3_m_baseColorMapUvIndex];
+
+ // ------- Combine Albedo, roughness, specular, roughness ---------
- float3 layer1_sampledColor = GetBaseColorInput(MaterialSrg::m_layer1_m_baseColorMap, MaterialSrg::m_sampler, layer1_baseColorUv, MaterialSrg::m_layer1_m_baseColor.rgb, o_layer1_o_baseColor_useTexture);
- float3 layer2_sampledColor = GetBaseColorInput(MaterialSrg::m_layer2_m_baseColorMap, MaterialSrg::m_sampler, layer2_baseColorUv, MaterialSrg::m_layer2_m_baseColor.rgb, o_layer2_o_baseColor_useTexture);
- float3 layer3_sampledColor = GetBaseColorInput(MaterialSrg::m_layer3_m_baseColorMap, MaterialSrg::m_sampler, layer3_baseColorUv, MaterialSrg::m_layer3_m_baseColor.rgb, o_layer3_o_baseColor_useTexture);
- float3 layer1_baseColor = BlendBaseColor(layer1_sampledColor, MaterialSrg::m_layer1_m_baseColor.rgb, MaterialSrg::m_layer1_m_baseColorFactor, o_layer1_o_baseColorTextureBlendMode, o_layer1_o_baseColor_useTexture);
- float3 layer2_baseColor = BlendBaseColor(layer2_sampledColor, MaterialSrg::m_layer2_m_baseColor.rgb, MaterialSrg::m_layer2_m_baseColorFactor, o_layer2_o_baseColorTextureBlendMode, o_layer2_o_baseColor_useTexture);
- float3 layer3_baseColor = BlendBaseColor(layer3_sampledColor, MaterialSrg::m_layer3_m_baseColor.rgb, MaterialSrg::m_layer3_m_baseColorFactor, o_layer3_o_baseColorTextureBlendMode, o_layer3_o_baseColor_useTexture);
- float3 baseColor = BlendLayers(layer1_baseColor, layer2_baseColor, layer3_baseColor, blendWeights);
+ float3 baseColor = BlendLayers(lightingInputLayer1.m_baseColor, lightingInputLayer2.m_baseColor, lightingInputLayer3.m_baseColor, blendWeights);
+ float3 specularF0Factor = BlendLayers(lightingInputLayer1.m_specularF0Factor, lightingInputLayer2.m_specularF0Factor, lightingInputLayer3.m_specularF0Factor, blendWeights);
+ float3 metallic = BlendLayers(lightingInputLayer1.m_metallic, lightingInputLayer2.m_metallic, lightingInputLayer3.m_metallic, blendWeights);
if(o_parallax_highlightClipping && displacementIsClipped)
{
ApplyParallaxClippingHighlight(baseColor);
}
- // ------- Metallic -------
-
- float metallic = 0;
- if(!o_enableSubsurfaceScattering) // If subsurface scattering is enabled skip texture lookup for metallic, as this quantity won't be used anyway
- {
- float layer1_metallic = GetMetallicInput(MaterialSrg::m_layer1_m_metallicMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_metallicMapUvIndex], MaterialSrg::m_layer1_m_metallicFactor, o_layer1_o_metallic_useTexture);
- float layer2_metallic = GetMetallicInput(MaterialSrg::m_layer2_m_metallicMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_metallicMapUvIndex], MaterialSrg::m_layer2_m_metallicFactor, o_layer2_o_metallic_useTexture);
- float layer3_metallic = GetMetallicInput(MaterialSrg::m_layer3_m_metallicMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_metallicMapUvIndex], MaterialSrg::m_layer3_m_metallicFactor, o_layer3_o_metallic_useTexture);
- metallic = BlendLayers(layer1_metallic, layer2_metallic, layer3_metallic, blendWeights);
- }
-
- // ------- Specular -------
-
- float layer1_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer1_m_specularF0Map, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_specularF0MapUvIndex], MaterialSrg::m_layer1_m_specularF0Factor, o_layer1_o_specularF0_useTexture);
- float layer2_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer2_m_specularF0Map, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_specularF0MapUvIndex], MaterialSrg::m_layer2_m_specularF0Factor, o_layer2_o_specularF0_useTexture);
- float layer3_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer3_m_specularF0Map, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_specularF0MapUvIndex], MaterialSrg::m_layer3_m_specularF0Factor, o_layer3_o_specularF0_useTexture);
- float specularF0Factor = BlendLayers(layer1_specularF0Factor, layer2_specularF0Factor, layer3_specularF0Factor, blendWeights);
-
surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic);
- // ------- Roughness -------
-
- float layer1_roughness = GetRoughnessInput(MaterialSrg::m_layer1_m_roughnessMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_roughnessMapUvIndex], MaterialSrg::m_layer1_m_roughnessFactor, MaterialSrg::m_layer1_m_roughnessLowerBound, MaterialSrg::m_layer1_m_roughnessUpperBound, o_layer1_o_roughness_useTexture);
- float layer2_roughness = GetRoughnessInput(MaterialSrg::m_layer2_m_roughnessMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_roughnessMapUvIndex], MaterialSrg::m_layer2_m_roughnessFactor, MaterialSrg::m_layer2_m_roughnessLowerBound, MaterialSrg::m_layer2_m_roughnessUpperBound, o_layer2_o_roughness_useTexture);
- float layer3_roughness = GetRoughnessInput(MaterialSrg::m_layer3_m_roughnessMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_roughnessMapUvIndex], MaterialSrg::m_layer3_m_roughnessFactor, MaterialSrg::m_layer3_m_roughnessLowerBound, MaterialSrg::m_layer3_m_roughnessUpperBound, o_layer3_o_roughness_useTexture);
- surface.roughnessLinear = BlendLayers(layer1_roughness, layer2_roughness, layer3_roughness, blendWeights);
-
+ surface.roughnessLinear = BlendLayers(lightingInputLayer1.m_roughness, lightingInputLayer2.m_roughness, lightingInputLayer3.m_roughness, blendWeights);
surface.CalculateRoughnessA();
-
- // ------- Subsurface -------
-
- float2 subsurfaceUv = IN.m_uv[MaterialSrg::m_subsurfaceScatteringInfluenceMapUvIndex];
- float surfaceScatteringFactor = GetSubsurfaceInput(MaterialSrg::m_subsurfaceScatteringInfluenceMap, MaterialSrg::m_sampler, subsurfaceUv, MaterialSrg::m_subsurfaceScatteringFactor);
-
- // ------- Transmission -------
-
- float2 transmissionUv = IN.m_uv[MaterialSrg::m_transmissionThicknessMapUvIndex];
- float4 transmissionTintThickness = GeTransmissionInput(MaterialSrg::m_transmissionThicknessMap, MaterialSrg::m_sampler, transmissionUv, MaterialSrg::m_transmissionTintThickness);
- surface.transmission.tint = transmissionTintThickness.rgb;
- surface.transmission.thickness = transmissionTintThickness.w;
- surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams;
- // ------- Lighting Data -------
-
+ // ------- Init and Combine Lighting Data -------
+
LightingData lightingData;
// Light iterator
@@ -307,88 +442,22 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// Directional light shadow coordinates
lightingData.shadowCoords = IN.m_shadowCoords;
-
- // ------- Emissive -------
- float3 layer1_emissive = GetEmissiveInput(MaterialSrg::m_layer1_m_emissiveMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_emissiveMapUvIndex], MaterialSrg::m_layer1_m_emissiveIntensity, MaterialSrg::m_layer1_m_emissiveColor.rgb, o_layer1_o_emissiveEnabled, o_layer1_o_emissive_useTexture);
- float3 layer2_emissive = GetEmissiveInput(MaterialSrg::m_layer2_m_emissiveMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_emissiveMapUvIndex], MaterialSrg::m_layer2_m_emissiveIntensity, MaterialSrg::m_layer2_m_emissiveColor.rgb, o_layer2_o_emissiveEnabled, o_layer2_o_emissive_useTexture);
- float3 layer3_emissive = GetEmissiveInput(MaterialSrg::m_layer3_m_emissiveMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_emissiveMapUvIndex], MaterialSrg::m_layer3_m_emissiveIntensity, MaterialSrg::m_layer3_m_emissiveColor.rgb, o_layer3_o_emissiveEnabled, o_layer3_o_emissive_useTexture);
- lightingData.emissiveLighting = BlendLayers(layer1_emissive, layer2_emissive, layer3_emissive, blendWeights);
+ lightingData.emissiveLighting = BlendLayers(lightingInputLayer1.m_emissiveLighting, lightingInputLayer2.m_emissiveLighting, lightingInputLayer3.m_emissiveLighting, blendWeights);
+ lightingData.specularOcclusion = BlendLayers(lightingInputLayer1.m_specularOcclusion, lightingInputLayer2.m_specularOcclusion, lightingInputLayer3.m_specularOcclusion, blendWeights);
+ lightingData.diffuseAmbientOcclusion = BlendLayers(lightingInputLayer1.m_diffuseAmbientOcclusion, lightingInputLayer2.m_diffuseAmbientOcclusion, lightingInputLayer3.m_diffuseAmbientOcclusion, blendWeights);
- // ------- Occlusion -------
-
- float layer1_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer1_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer1_m_diffuseOcclusionFactor, o_layer1_o_diffuseOcclusion_useTexture);
- float layer2_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer2_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer2_m_diffuseOcclusionFactor, o_layer2_o_diffuseOcclusion_useTexture);
- float layer3_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer3_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer3_m_diffuseOcclusionFactor, o_layer3_o_diffuseOcclusion_useTexture);
- lightingData.diffuseAmbientOcclusion = BlendLayers(layer1_diffuseAmbientOcclusion, layer2_diffuseAmbientOcclusion, layer3_diffuseAmbientOcclusion, blendWeights);
+ lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation);
- float layer1_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer1_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer1_m_specularOcclusionFactor, o_layer1_o_specularOcclusion_useTexture);
- float layer2_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer2_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer2_m_specularOcclusionFactor, o_layer2_o_specularOcclusion_useTexture);
- float layer3_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer3_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer3_m_specularOcclusionFactor, o_layer3_o_specularOcclusion_useTexture);
- lightingData.specularOcclusion = BlendLayers(layer1_specularOcclusion, layer2_specularOcclusion, layer3_specularOcclusion, blendWeights);
-
- // ------- Clearcoat -------
+ // ------- Combine Clearcoat -------
if(o_clearCoat_feature_enabled)
{
- // --- Layer 1 ---
-
- float layer1_clearCoatFactor = 0.0f;
- float layer1_clearCoatRoughness = 0.0f;
- float3 layer1_clearCoatNormal = float3(0.0, 0.0, 0.0);
- if(o_layer1_o_clearCoat_enabled)
- {
- float3x3 layer1_uvMatrix = MaterialSrg::m_layer1_m_clearCoatNormalMapUvIndex == 0 ? MaterialSrg::m_layer1_m_uvMatrix : CreateIdentity3x3();
-
- GetClearCoatInputs(MaterialSrg::m_layer1_m_clearCoatInfluenceMap, uvLayer1[MaterialSrg::m_layer1_m_clearCoatInfluenceMapUvIndex], MaterialSrg::m_layer1_m_clearCoatFactor, o_layer1_o_clearCoat_factor_useTexture,
- MaterialSrg::m_layer1_m_clearCoatRoughnessMap, uvLayer1[MaterialSrg::m_layer1_m_clearCoatRoughnessMapUvIndex], MaterialSrg::m_layer1_m_clearCoatRoughness, o_layer1_o_clearCoat_roughness_useTexture,
- MaterialSrg::m_layer1_m_clearCoatNormalMap, uvLayer1[MaterialSrg::m_layer1_m_clearCoatNormalMapUvIndex], IN.m_normal, o_layer1_o_clearCoat_normal_useTexture, MaterialSrg::m_layer1_m_clearCoatNormalStrength,
- layer1_uvMatrix, tangents[MaterialSrg::m_layer1_m_clearCoatNormalMapUvIndex], bitangents[MaterialSrg::m_layer1_m_clearCoatNormalMapUvIndex],
- MaterialSrg::m_sampler, isFrontFace,
- layer1_clearCoatFactor, layer1_clearCoatRoughness, layer1_clearCoatNormal);
- }
-
- // --- Layer 2 ---
-
- float layer2_clearCoatFactor = 0.0f;
- float layer2_clearCoatRoughness = 0.0f;
- float3 layer2_clearCoatNormal = float3(0.0, 0.0, 0.0);
- if(o_layer2_o_clearCoat_enabled)
- {
- float3x3 layer2_uvMatrix = MaterialSrg::m_layer2_m_clearCoatNormalMapUvIndex == 0 ? MaterialSrg::m_layer2_m_uvMatrix : CreateIdentity3x3();
-
- GetClearCoatInputs(MaterialSrg::m_layer2_m_clearCoatInfluenceMap, uvLayer2[MaterialSrg::m_layer2_m_clearCoatInfluenceMapUvIndex], MaterialSrg::m_layer2_m_clearCoatFactor, o_layer2_o_clearCoat_factor_useTexture,
- MaterialSrg::m_layer2_m_clearCoatRoughnessMap, uvLayer2[MaterialSrg::m_layer2_m_clearCoatRoughnessMapUvIndex], MaterialSrg::m_layer2_m_clearCoatRoughness, o_layer2_o_clearCoat_roughness_useTexture,
- MaterialSrg::m_layer2_m_clearCoatNormalMap, uvLayer2[MaterialSrg::m_layer2_m_clearCoatNormalMapUvIndex], IN.m_normal, o_layer2_o_clearCoat_normal_useTexture, MaterialSrg::m_layer2_m_clearCoatNormalStrength,
- layer2_uvMatrix, tangents[MaterialSrg::m_layer2_m_clearCoatNormalMapUvIndex], bitangents[MaterialSrg::m_layer2_m_clearCoatNormalMapUvIndex],
- MaterialSrg::m_sampler, isFrontFace,
- layer2_clearCoatFactor, layer2_clearCoatRoughness, layer2_clearCoatNormal);
- }
-
- // --- Layer 3 ---
-
- float layer3_clearCoatFactor = 0.0f;
- float layer3_clearCoatRoughness = 0.0f;
- float3 layer3_clearCoatNormal = float3(0.0, 0.0, 0.0);
- if(o_layer3_o_clearCoat_enabled)
- {
- float3x3 layer3_uvMatrix = MaterialSrg::m_layer3_m_clearCoatNormalMapUvIndex == 0 ? MaterialSrg::m_layer3_m_uvMatrix : CreateIdentity3x3();
-
- GetClearCoatInputs(MaterialSrg::m_layer3_m_clearCoatInfluenceMap, uvLayer3[MaterialSrg::m_layer3_m_clearCoatInfluenceMapUvIndex], MaterialSrg::m_layer3_m_clearCoatFactor, o_layer3_o_clearCoat_factor_useTexture,
- MaterialSrg::m_layer3_m_clearCoatRoughnessMap, uvLayer3[MaterialSrg::m_layer3_m_clearCoatRoughnessMapUvIndex], MaterialSrg::m_layer3_m_clearCoatRoughness, o_layer3_o_clearCoat_roughness_useTexture,
- MaterialSrg::m_layer3_m_clearCoatNormalMap, uvLayer3[MaterialSrg::m_layer3_m_clearCoatNormalMapUvIndex], IN.m_normal, o_layer3_o_clearCoat_normal_useTexture, MaterialSrg::m_layer3_m_clearCoatNormalStrength,
- layer3_uvMatrix, tangents[MaterialSrg::m_layer3_m_clearCoatNormalMapUvIndex], bitangents[MaterialSrg::m_layer3_m_clearCoatNormalMapUvIndex],
- MaterialSrg::m_sampler, isFrontFace,
- layer3_clearCoatFactor, layer3_clearCoatRoughness, layer3_clearCoatNormal);
- }
-
- // --- Blend Layers ---
-
- surface.clearCoat.factor = BlendLayers(layer1_clearCoatFactor, layer2_clearCoatFactor, layer3_clearCoatFactor, blendWeights);
- surface.clearCoat.roughness = BlendLayers(layer1_clearCoatRoughness, layer2_clearCoatRoughness, layer3_clearCoatRoughness, blendWeights);
+ surface.clearCoat.factor = BlendLayers(lightingInputLayer1.m_clearCoat.factor, lightingInputLayer2.m_clearCoat.factor, lightingInputLayer3.m_clearCoat.factor, blendWeights);
+ surface.clearCoat.roughness = BlendLayers(lightingInputLayer1.m_clearCoat.roughness, lightingInputLayer2.m_clearCoat.roughness, lightingInputLayer3.m_clearCoat.roughness, blendWeights);
// [GFX TODO][ATOM-14592] This is not the right way to blend the normals. We need to use ReorientTangentSpaceNormal(), and that requires GetClearCoatInputs() to return the normal in TS instead of WS.
- surface.clearCoat.normal = BlendLayers(layer1_clearCoatNormal, layer2_clearCoatNormal, layer3_clearCoatNormal, blendWeights);
+ surface.clearCoat.normal = BlendLayers(lightingInputLayer1.m_clearCoat.normal, lightingInputLayer2.m_clearCoat.normal, lightingInputLayer3.m_clearCoat.normal, blendWeights);
surface.clearCoat.normal = normalize(surface.clearCoat.normal);
// manipulate base layer f0 if clear coat is enabled
@@ -408,11 +477,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// Clear coat layer has fixed IOR = 1.5 and transparent => F0 = (1.5 - 1)^2 / (1.5 + 1)^2 = 0.04
lightingData.diffuseResponse *= 1.0 - (FresnelSchlickWithRoughness(lightingData.NdotV, float3(0.04, 0.04, 0.04), surface.clearCoat.roughness) * surface.clearCoat.factor);
}
-
- // ------- Multiscatter -------
-
- lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation);
-
+
// ------- Lighting Calculation -------
// Apply Decals
@@ -425,17 +490,14 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
ApplyIBL(surface, lightingData);
// Finalize Lighting
- lightingData.FinalizeLighting(surface.transmission.tint);
+ lightingData.FinalizeLighting(0);
const float alpha = 1.0;
PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha);
- // Pack factor and quality, drawback: because of precision limit of float16 cannot represent exact 1, maximum representable value is 0.9961
- uint factorAndQuality = dot(round(float2(saturate(surfaceScatteringFactor), MaterialSrg::m_subsurfaceScatteringQuality) * 255), float2(256, 1));
- lightingOutput.m_diffuseColor.w = factorAndQuality * (o_enableSubsurfaceScattering ? 1.0 : -1.0);
-
+ lightingOutput.m_diffuseColor.w = -1; // Disable subsurface scattering
return lightingOutput;
}
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli
index bb63d27df0..85d9370d2b 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli
@@ -32,6 +32,8 @@ class Surface
float roughnessA; //!< Actual roughness value ( a.k.a. "alpha roughness") to be used in microfacet calculations
float roughnessA2; //!< Alpha roughness ^ 2 (i.e. roughnessA * roughnessA), used in GGX, cached here for perfromance
+ void InitializeToZero();
+
//! Applies specular anti-aliasing to roughnessA2
void ApplySpecularAA();
@@ -43,6 +45,18 @@ class Surface
};
+void Surface::InitializeToZero()
+{
+ clearCoat.InitializeToZero();
+ transmission.InitializeToZero();
+ position = float3(0,0,0);
+ normal = float3(0,0,0);
+ albedo = float3(0,0,0);
+ specularF0 = float3(0,0,0);
+ roughnessLinear = 0.0f;
+ roughnessA = 0.0f;
+ roughnessA2 = 0.0f;
+}
// Specular Anti-Aliasing technique from this paper:
// http://www.jp.square-enix.com/tech/library/pdf/ImprovedGeometricSpecularAA.pdf
From 275bb1bfeccabb816880960c6afe61ff80e9fb58 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Tue, 11 May 2021 17:25:53 -0700
Subject: [PATCH 013/132] ATOM-14688 Disable Individual Layers
Added flags for enabling StandardMultilayerPBR layers 2 and 3. This makes it easy to create a two-layer material, or to flip layers off and on for debugging.
---
.../Types/StandardMultilayerPBR.materialtype | 22 +++++++
.../Types/StandardMultilayerPBR_Common.azsli | 64 +++++++++++++------
.../StandardMultilayerPBR_ForwardPass.azsl | 20 +++++-
.../001_ManyFeatures.material | 4 ++
.../001_ManyFeatures_Layer2Off.material | 11 ++++
.../001_ManyFeatures_Layer3Off.material | 11 ++++
.../002_ParallaxPdo.material | 4 ++
7 files changed, 114 insertions(+), 22 deletions(-)
create mode 100644 Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer2Off.material
create mode 100644 Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer3Off.material
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
index 90a599c6f9..b49c66346f 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
@@ -295,6 +295,28 @@
}
],
"blend": [
+ {
+ "id": "enableLayer2",
+ "displayName": "Enable Layer 2",
+ "description": "Whether to enable layer 2.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "id": "o_layer2_enabled"
+ }
+ },
+ {
+ "id": "enableLayer3",
+ "displayName": "Enable Layer 3",
+ "description": "Whether to enable layer 3.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "id": "o_layer3_enabled"
+ }
+ },
{
"id": "blendSource",
"displayName": "Blend Source",
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
index 8c7b49214b..d2314efefe 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Common.azsli
@@ -95,6 +95,9 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial
// ------ Shader Options ----------------------------------------
+option bool o_layer2_enabled;
+option bool o_layer3_enabled;
+
enum class DebugDrawMode { None, BlendSource, DepthMaps };
option DebugDrawMode o_debugDrawMode;
@@ -146,14 +149,27 @@ float3 GetBlendSourceValues(float2 uv)
{
float3 blendSourceValues = float3(0,0,0);
- switch(GetFinalBlendMaskSource())
+ if(o_layer2_enabled || o_layer3_enabled)
{
- case BlendMaskSource::TextureMap:
- blendSourceValues = MaterialSrg::m_blendMaskTexture.Sample(MaterialSrg::m_sampler, uv).rgb;
- break;
- case BlendMaskSource::VertexColors:
- blendSourceValues = s_blendMaskFromVertexStream;
- break;
+ switch(GetFinalBlendMaskSource())
+ {
+ case BlendMaskSource::TextureMap:
+ blendSourceValues = MaterialSrg::m_blendMaskTexture.Sample(MaterialSrg::m_sampler, uv).rgb;
+ break;
+ case BlendMaskSource::VertexColors:
+ blendSourceValues = s_blendMaskFromVertexStream;
+ break;
+ }
+
+ if(!o_layer2_enabled)
+ {
+ blendSourceValues.r = 0.0;
+ }
+
+ if(!o_layer3_enabled)
+ {
+ blendSourceValues.g = 0.0;
+ }
}
return blendSourceValues;
@@ -167,18 +183,26 @@ float3 GetBlendSourceValues(float2 uv)
//! layer3 = b
float3 GetBlendWeights(float2 uv)
{
- float3 blendSourceValues = GetBlendSourceValues(uv);
-
- // Calculate blend weights such that multiplying and adding them with layer data is equivalent
- // to lerping between each layer.
- // final = lerp(final, layer1, blendWeights.r)
- // final = lerp(final, layer2, blendWeights.g)
- // final = lerp(final, layer3, blendWeights.b)
-
float3 blendWeights;
- blendWeights.b = blendSourceValues.g;
- blendWeights.g = (1.0 - blendSourceValues.g) * blendSourceValues.r;
- blendWeights.r = (1.0 - blendSourceValues.g) * (1.0 - blendSourceValues.r);
+
+ if(o_layer2_enabled || o_layer3_enabled)
+ {
+ float3 blendSourceValues = GetBlendSourceValues(uv);
+
+ // Calculate blend weights such that multiplying and adding them with layer data is equivalent
+ // to lerping between each layer.
+ // final = lerp(final, layer1, blendWeights.r)
+ // final = lerp(final, layer2, blendWeights.g)
+ // final = lerp(final, layer3, blendWeights.b)
+
+ blendWeights.b = blendSourceValues.g;
+ blendWeights.g = (1.0 - blendSourceValues.g) * blendSourceValues.r;
+ blendWeights.r = (1.0 - blendSourceValues.g) * (1.0 - blendSourceValues.r);
+ }
+ else
+ {
+ blendWeights = float3(1,0,0);
+ }
return blendWeights;
}
@@ -230,7 +254,7 @@ DepthResult GetDepth(float2 uv, float2 uv_ddx, float2 uv_ddy)
layerDepthValues.r -= MaterialSrg::m_layer1_m_depthOffset;
}
- if(o_layer2_o_useDepthMap)
+ if(o_layer2_enabled && o_layer2_o_useDepthMap)
{
float2 layerUv = uv;
if(MaterialSrg::m_parallaxUvIndex == 0)
@@ -243,7 +267,7 @@ DepthResult GetDepth(float2 uv, float2 uv_ddx, float2 uv_ddy)
layerDepthValues.g -= MaterialSrg::m_layer2_m_depthOffset;
}
- if(o_layer3_o_useDepthMap)
+ if(o_layer3_enabled && o_layer3_o_useDepthMap)
{
float2 layerUv = uv;
if(MaterialSrg::m_parallaxUvIndex == 0)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
index 9e5a2e623a..8d5d32940d 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl
@@ -387,20 +387,30 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// ----------- Layer 2 -----------
ProcessedMaterialInputs lightingInputLayer2;
+ if(o_layer2_enabled)
{
StandardMaterialInputs inputs;
FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer2_, o_layer2_, blendWeights.g)
lightingInputLayer2 = ProcessStandardMaterialInputs(inputs);
}
+ else
+ {
+ lightingInputLayer2.InitializeToZero();
+ }
// ----------- Layer 3 -----------
ProcessedMaterialInputs lightingInputLayer3;
+ if(o_layer3_enabled)
{
StandardMaterialInputs inputs;
FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer3_, o_layer3_, blendWeights.b)
lightingInputLayer3 = ProcessStandardMaterialInputs(inputs);
}
+ else
+ {
+ lightingInputLayer3.InitializeToZero();
+ }
// ------- Combine all layers ---------
@@ -411,8 +421,14 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// ------- Combine Normals ---------
float3 normalTS = lightingInputLayer1.m_normalTS;
- normalTS = ReorientTangentSpaceNormal(normalTS, lightingInputLayer2.m_normalTS);
- normalTS = ReorientTangentSpaceNormal(normalTS, lightingInputLayer3.m_normalTS);
+ if(o_layer2_enabled)
+ {
+ normalTS = ReorientTangentSpaceNormal(normalTS, lightingInputLayer2.m_normalTS);
+ }
+ if(o_layer3_enabled)
+ {
+ normalTS = ReorientTangentSpaceNormal(normalTS, lightingInputLayer3.m_normalTS);
+ }
// [GFX TODO][ATOM-14591]: This will only work if the normal maps all use the same UV stream. We would need to add support for having them in different UV streams.
surface.normal = normalize(TangentSpaceToWorld(normalTS, IN.m_normal, tangents[MaterialSrg::m_parallaxUvIndex], bitangents[MaterialSrg::m_parallaxUvIndex]));
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material
index b85705fcb8..d9a4aabe2a 100644
--- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material
@@ -4,6 +4,10 @@
"parentMaterial": "",
"propertyLayoutVersion": 3,
"properties": {
+ "blend": {
+ "enableLayer2": true,
+ "enableLayer3": true
+ },
"layer1_baseColor": {
"color": [
0.3495536744594574,
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer2Off.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer2Off.material
new file mode 100644
index 0000000000..d91cfb34eb
--- /dev/null
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer2Off.material
@@ -0,0 +1,11 @@
+{
+ "description": "",
+ "materialType": "Materials/Types/StandardMultilayerPBR.materialtype",
+ "parentMaterial": "TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material",
+ "propertyLayoutVersion": 3,
+ "properties": {
+ "blend": {
+ "enableLayer2": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer3Off.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer3Off.material
new file mode 100644
index 0000000000..3ee48df612
--- /dev/null
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures_Layer3Off.material
@@ -0,0 +1,11 @@
+{
+ "description": "",
+ "materialType": "Materials/Types/StandardMultilayerPBR.materialtype",
+ "parentMaterial": "TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material",
+ "propertyLayoutVersion": 3,
+ "properties": {
+ "blend": {
+ "enableLayer3": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material
index f6c881aee5..0bf4177db9 100644
--- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material
+++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material
@@ -4,6 +4,10 @@
"parentMaterial": "",
"propertyLayoutVersion": 3,
"properties": {
+ "blend": {
+ "enableLayer2": true,
+ "enableLayer3": true
+ },
"layer1_baseColor": {
"textureMap": "TestData/Textures/cc0/bark1_col.jpg"
},
From 53188a12da7d3ce90de64a0d184b6a5f9df613d8 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Wed, 12 May 2021 17:06:57 -0700
Subject: [PATCH 014/132] Made StandardMultilayerPBR hide a layer's property
groups when that layer is disabled.
ATOM-14688 Disable Individual Layers
- Added new SetMaterialPropertyGroupVisibility functions to the material functors.
- Updated the MaterialFunctor::EditorContext to include parameters for handling material property group metadata.
- Updated the material inspector(s) to apply the property group visiblity changes from the material functor, to hide or show the property groups.
- Moved some code from MaterialPropertyDescriptor.h/cpp to a new MaterialDynamicMetadata.h/cpp, since these aren't really related to the MaterialPropertyDescriptor code. It's more for material functors to use.
- Also fixed the casing for the "GetMaterialPropertyValue_Image" lua function, since I was already in this code (ATOM-14793 "Fix Inconsistent Casing For LuaMaterialFunctorRuntimeContext")
Tested in MaterialEditor and in in the main Editor's MaterialComponent property override inspector.
---
.../DetailMapsCommonFunctor.lua | 8 +-
.../Materials/Types/Skin_WrinkleMaps.lua | 4 +-
.../Types/StandardMultilayerPBR.materialtype | 6 ++
.../StandardMultilayerPBR_LayerEnable.lua | 49 +++++++++
...StandardMultilayerPBR_ParallaxPerLayer.lua | 4 +-
.../Types/StandardPBR_ClearCoatState.lua | 4 +-
.../Types/StandardPBR_EmissiveState.lua | 4 +-
.../Types/StandardPBR_HandleOpacityMode.lua | 2 +-
.../Types/StandardPBR_ParallaxState.lua | 4 +-
.../Materials/Types/StandardPBR_Roughness.lua | 4 +-
.../Types/StandardPBR_SubsurfaceState.lua | 4 +-
.../RPI.Reflect/Material/LuaMaterialFunctor.h | 2 +
.../Material/MaterialDynamicMetadata.h | 100 ++++++++++++++++++
.../RPI.Reflect/Material/MaterialFunctor.h | 20 +++-
.../Material/MaterialPropertyDescriptor.h | 47 --------
.../RPI.Public/Material/MaterialSystem.cpp | 1 +
.../Material/LuaMaterialFunctor.cpp | 17 ++-
.../Material/MaterialDynamicMetadata.cpp | 50 +++++++++
.../RPI.Reflect/Material/MaterialFunctor.cpp | 96 ++++++++++++-----
.../Material/MaterialPropertyDescriptor.cpp | 14 ---
.../Material/LuaMaterialFunctorTests.cpp | 76 ++++++++++++-
.../MaterialPropertySerializerTests.cpp | 1 +
.../RPI/Code/atom_rpi_reflect_files.cmake | 2 +
.../DynamicProperty/DynamicProperty.h | 6 +-
.../Inspector/InspectorRequestBus.h | 6 ++
.../Inspector/InspectorWidget.h | 3 +
.../Code/Source/Inspector/InspectorWidget.cpp | 27 +++++
.../MaterialDocumentNotificationBus.h | 7 ++
.../Document/MaterialDocumentRequestBus.h | 5 +
.../Code/Source/Document/MaterialDocument.cpp | 58 ++++++++--
.../Code/Source/Document/MaterialDocument.h | 21 +++-
.../MaterialInspector/MaterialInspector.cpp | 16 ++-
.../MaterialInspector/MaterialInspector.h | 1 +
.../EditorMaterialComponentInspector.cpp | 25 +++--
34 files changed, 553 insertions(+), 141 deletions(-)
create mode 100644 Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_LayerEnable.lua
create mode 100644 Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialDynamicMetadata.h
create mode 100644 Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialDynamicMetadata.cpp
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsCommonFunctor.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsCommonFunctor.lua
index 15e4b4f416..e1a3dd6f29 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsCommonFunctor.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsCommonFunctor.lua
@@ -35,16 +35,16 @@ end
function Process(context)
local isFeatureEnabled = context:GetMaterialPropertyValue_bool("detailLayerGroup.enableDetailLayer")
- local blendMaskTexture = context:GetMaterialPropertyValue_image("detailLayerGroup.blendDetailMask")
+ local blendMaskTexture = context:GetMaterialPropertyValue_Image("detailLayerGroup.blendDetailMask")
local blendMaskTextureEnabled = context:GetMaterialPropertyValue_bool("detailLayerGroup.enableDetailMaskTexture")
context:SetShaderOptionValue_bool("o_detail_blendMask_useTexture", isFeatureEnabled and blendMaskTextureEnabled and blendMaskTexture ~= nil)
local baseColorDetailEnabled = context:GetMaterialPropertyValue_bool("detailLayerGroup.enableBaseColor")
- local baseColorDetailTexture = context:GetMaterialPropertyValue_image("detailLayerGroup.baseColorDetailMap")
+ local baseColorDetailTexture = context:GetMaterialPropertyValue_Image("detailLayerGroup.baseColorDetailMap")
context:SetShaderOptionValue_bool("o_detail_baseColor_useTexture", isFeatureEnabled and baseColorDetailEnabled and baseColorDetailTexture ~= nil)
local normalDetailEnabled = context:GetMaterialPropertyValue_bool("detailLayerGroup.enableNormals")
- local normalDetailTexture = context:GetMaterialPropertyValue_image("detailLayerGroup.normalDetailMap")
+ local normalDetailTexture = context:GetMaterialPropertyValue_Image("detailLayerGroup.normalDetailMap")
context:SetShaderOptionValue_bool("o_detail_normal_useTexture", isFeatureEnabled and normalDetailEnabled and normalDetailTexture ~= nil)
end
@@ -78,7 +78,7 @@ function ProcessEditor(context)
context:SetMaterialPropertyVisibility("detailUV.rotateDegrees", mainVisibility)
context:SetMaterialPropertyVisibility("detailUV.scale", mainVisibility)
- local blendMaskTexture = context:GetMaterialPropertyValue_image("detailLayerGroup.blendDetailMask")
+ local blendMaskTexture = context:GetMaterialPropertyValue_Image("detailLayerGroup.blendDetailMask")
if(nil == blendMaskTexture) then
context:SetMaterialPropertyVisibility("detailLayerGroup.enableDetailMaskTexture", MaterialPropertyVisibility_Hidden)
context:SetMaterialPropertyVisibility("detailLayerGroup.blendDetailMaskUv", MaterialPropertyVisibility_Hidden)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_WrinkleMaps.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_WrinkleMaps.lua
index d77918f521..9e1bc3763a 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_WrinkleMaps.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_WrinkleMaps.lua
@@ -65,8 +65,8 @@ function Process(context)
for i=1,MAX_WRINKLE_LAYER_COUNT do
if(i <= count) then
- isBaseColorTextureMissing = isBaseColorEnabled and nil == context:GetMaterialPropertyValue_image("wrinkleLayers.baseColorMap" .. i)
- isNormalTextureMissing = isNormalEnabled and nil == context:GetMaterialPropertyValue_image("wrinkleLayers.normalMap" .. i)
+ isBaseColorTextureMissing = isBaseColorEnabled and nil == context:GetMaterialPropertyValue_Image("wrinkleLayers.baseColorMap" .. i)
+ isNormalTextureMissing = isNormalEnabled and nil == context:GetMaterialPropertyValue_Image("wrinkleLayers.normalMap" .. i)
context:SetShaderOptionValue_bool("o_wrinkleLayers_baseColor_useTexture" .. i, not isBaseColorTextureMissing)
context:SetShaderOptionValue_bool("o_wrinkleLayers_normal_useTexture" .. i, not isNormalTextureMissing)
else
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
index b49c66346f..a2854e8902 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype
@@ -2684,6 +2684,12 @@
"file": "StandardMultilayerPBR_ShaderEnable.lua"
}
},
+ {
+ "type": "Lua",
+ "args": {
+ "file": "StandardMultilayerPBR_LayerEnable.lua"
+ }
+ },
{
"type": "Lua",
"args": {
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_LayerEnable.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_LayerEnable.lua
new file mode 100644
index 0000000000..f60aac6149
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_LayerEnable.lua
@@ -0,0 +1,49 @@
+--------------------------------------------------------------------------------------
+--
+-- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+-- its licensors.
+--
+-- For complete copyright and license terms please see the LICENSE at the root of this
+-- distribution (the "License"). All use of this software is governed by the License,
+-- or, if provided, by the license below or the license accompanying this file. Do not
+-- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+--
+--
+----------------------------------------------------------------------------------------------------
+
+-- This functor hides the properties for disabled material layers.
+
+function GetMaterialPropertyDependencies()
+ return {
+ "blend.enableLayer2",
+ "blend.enableLayer3"
+ }
+end
+
+function SetLayerVisibility(context, layerNamePrefix, isVisible)
+
+ local visibility = MaterialPropertyGroupVisibility_Enabled
+ if(not isVisible) then
+ visibility = MaterialPropertyGroupVisibility_Hidden
+ end
+
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "baseColor", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "metallic", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "roughness", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "specularF0", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "normal", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "clearCoat", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "occlusion", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "emissive", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "parallax", visibility)
+ context:SetMaterialPropertyGroupVisibility(layerNamePrefix .. "uv", visibility)
+end
+
+function ProcessEditor(context)
+ local enableLayer2 = context:GetMaterialPropertyValue_bool("blend.enableLayer2")
+ local enableLayer3 = context:GetMaterialPropertyValue_bool("blend.enableLayer3")
+
+ SetLayerVisibility(context, "layer2_", context:GetMaterialPropertyValue_bool("blend.enableLayer2"))
+ SetLayerVisibility(context, "layer3_", context:GetMaterialPropertyValue_bool("blend.enableLayer3"))
+end
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ParallaxPerLayer.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ParallaxPerLayer.lua
index 119dfed436..bd56292229 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ParallaxPerLayer.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ParallaxPerLayer.lua
@@ -24,7 +24,7 @@ end
function Process(context)
local enable = context:GetMaterialPropertyValue_bool("parallax.enable")
- local textureMap = context:GetMaterialPropertyValue_image("parallax.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("parallax.textureMap")
context:SetShaderOptionValue_bool("o_useDepthMap", enable and textureMap ~= nil)
end
@@ -37,7 +37,7 @@ function ProcessEditor(context)
context:SetMaterialPropertyVisibility("parallax.textureMap", MaterialPropertyVisibility_Hidden)
end
- local textureMap = context:GetMaterialPropertyValue_image("parallax.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("parallax.textureMap")
local visibility = MaterialPropertyVisibility_Enabled
if(not enable or textureMap == nil) then
visibility = MaterialPropertyVisibility_Hidden
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatState.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatState.lua
index 8289291ef4..ffa00d7efd 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatState.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatState.lua
@@ -34,7 +34,7 @@ function GetShaderOptionDependencies()
end
function UpdateUseTextureState(context, clearCoatEnabled, textureMapPropertyName, useTexturePropertyName, shaderOptionName)
- local textureMap = context:GetMaterialPropertyValue_image(textureMapPropertyName)
+ local textureMap = context:GetMaterialPropertyValue_Image(textureMapPropertyName)
local useTextureMap = context:GetMaterialPropertyValue_bool(useTexturePropertyName)
context:SetShaderOptionValue_bool(shaderOptionName, clearCoatEnabled and useTextureMap and textureMap ~= nil)
end
@@ -50,7 +50,7 @@ end
-- Note this logic matches that of the UseTextureFunctor class.
function UpdateTextureDependentPropertyVisibility(context, textureMapPropertyName, useTexturePropertyName, uvPropertyName)
- local textureMap = context:GetMaterialPropertyValue_image(textureMapPropertyName)
+ local textureMap = context:GetMaterialPropertyValue_Image(textureMapPropertyName)
local useTexture = context:GetMaterialPropertyValue_bool(useTexturePropertyName)
if(textureMap == nil) then
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_EmissiveState.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_EmissiveState.lua
index a8ac2e8a4a..7ee5876adb 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_EmissiveState.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_EmissiveState.lua
@@ -22,7 +22,7 @@ end
function Process(context)
local enable = context:GetMaterialPropertyValue_bool("emissive.enable")
- local textureMap = context:GetMaterialPropertyValue_image("emissive.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("emissive.textureMap")
local useTextureMap = context:GetMaterialPropertyValue_bool("emissive.useTexture")
context:SetShaderOptionValue_bool("o_emissiveEnabled", enable)
@@ -47,7 +47,7 @@ function ProcessEditor(context)
context:SetMaterialPropertyVisibility("emissive.textureMapUv", mainVisibility)
if(enable) then
- local textureMap = context:GetMaterialPropertyValue_image("emissive.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("emissive.textureMap")
local useTextureMap = context:GetMaterialPropertyValue_bool("emissive.useTexture")
if(textureMap == nil) then
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_HandleOpacityMode.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_HandleOpacityMode.lua
index 6cc595d712..541b1ac1ce 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_HandleOpacityMode.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_HandleOpacityMode.lua
@@ -90,7 +90,7 @@ function ProcessEditor(context)
context:SetMaterialPropertyVisibility("opacity.textureMap", MaterialPropertyVisibility_Hidden)
context:SetMaterialPropertyVisibility("opacity.textureMapUv", MaterialPropertyVisibility_Hidden)
else
- local textureMap = context:GetMaterialPropertyValue_image("opacity.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("opacity.textureMap")
if(nil == textureMap) then
context:SetMaterialPropertyVisibility("opacity.textureMapUv", MaterialPropertyVisibility_Disabled)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ParallaxState.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ParallaxState.lua
index 0287e1105e..e6689da327 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ParallaxState.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ParallaxState.lua
@@ -22,7 +22,7 @@ end
function Process(context)
local enable = context:GetMaterialPropertyValue_bool("parallax.enable")
- local textureMap = context:GetMaterialPropertyValue_image("parallax.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("parallax.textureMap")
context:SetShaderOptionValue_bool("o_parallax_feature_enabled", enable)
context:SetShaderOptionValue_bool("o_useDepthMap", enable and textureMap ~= nil)
end
@@ -36,7 +36,7 @@ function ProcessEditor(context)
context:SetMaterialPropertyVisibility("parallax.textureMap", MaterialPropertyVisibility_Hidden)
end
- local textureMap = context:GetMaterialPropertyValue_image("parallax.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("parallax.textureMap")
local visibility = MaterialPropertyVisibility_Enabled
if(not enable or textureMap == nil) then
visibility = MaterialPropertyVisibility_Hidden
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Roughness.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Roughness.lua
index 4887bc47e8..222e69cd3d 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Roughness.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Roughness.lua
@@ -21,13 +21,13 @@ function GetShaderOptionDependencies()
end
function Process(context)
- local textureMap = context:GetMaterialPropertyValue_image("roughness.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("roughness.textureMap")
local useTexture = context:GetMaterialPropertyValue_bool("roughness.useTexture")
context:SetShaderOptionValue_bool("o_roughness_useTexture", useTexture and textureMap ~= nil)
end
function ProcessEditor(context)
- local textureMap = context:GetMaterialPropertyValue_image("roughness.textureMap")
+ local textureMap = context:GetMaterialPropertyValue_Image("roughness.textureMap")
local useTexture = context:GetMaterialPropertyValue_bool("roughness.useTexture")
if(nil == textureMap) then
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_SubsurfaceState.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_SubsurfaceState.lua
index fb07ac89a3..d8a69ba355 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_SubsurfaceState.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_SubsurfaceState.lua
@@ -35,7 +35,7 @@ TransmissionMode_ThickObject = 1
TransmissionMode_ThinObject = 2
function UpdateUseTextureState(context, subsurfaceScatteringEnabled, textureMapPropertyName, useTexturePropertyName, shaderOptionName)
- local textureMap = context:GetMaterialPropertyValue_image(textureMapPropertyName)
+ local textureMap = context:GetMaterialPropertyValue_Image(textureMapPropertyName)
local useTextureMap = context:GetMaterialPropertyValue_bool(useTexturePropertyName)
context:SetShaderOptionValue_bool(shaderOptionName, subsurfaceScatteringEnabled and useTextureMap and textureMap ~= nil)
end
@@ -53,7 +53,7 @@ function UpdateTextureDependentPropertyVisibility(context, featureEnabled, textu
context:SetMaterialPropertyVisibility(useTexturePropertyName, MaterialPropertyVisibility_Hidden)
context:SetMaterialPropertyVisibility(uvPropertyName, MaterialPropertyVisibility_Hidden)
else
- local textureMap = context:GetMaterialPropertyValue_image(textureMapPropertyName)
+ local textureMap = context:GetMaterialPropertyValue_Image(textureMapPropertyName)
local useTextureMap = context:GetMaterialPropertyValue_bool(useTexturePropertyName)
if(textureMap == nil) then
diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h
index 44de79ff22..396ba14810 100644
--- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h
+++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h
@@ -329,6 +329,8 @@ namespace AZ
bool SetMaterialPropertySoftMaxValue(const char* name, Type value);
bool SetMaterialPropertyDescription(const char* name, const char* description);
+
+ bool SetMaterialPropertyGroupVisibility(const char* name, MaterialPropertyGroupVisibility visibility);
private:
diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialDynamicMetadata.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialDynamicMetadata.h
new file mode 100644
index 0000000000..b74e330665
--- /dev/null
+++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialDynamicMetadata.h
@@ -0,0 +1,100 @@
+/*
+* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+* its licensors.
+*
+* For complete copyright and license terms please see the LICENSE at the root of this
+* distribution (the "License"). All use of this software is governed by the License,
+* or, if provided, by the license below or the license accompanying this file. Do not
+* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*
+*/
+#pragma once
+
+#include
+#include
+#include
+
+namespace AZ
+{
+ namespace RPI
+ {
+ // Normally we wouldn't want editor-related code mixed in with runtime code, but
+ // since this data can be modified dynamically, keeping it in the runtime makes
+ // the overall material functor design simpler and more user-friendly.
+
+
+ //! Visibility for each material property.
+ //! If the data field is empty, use default as editable.
+ enum class MaterialPropertyVisibility : uint32_t
+ {
+ Enabled, //!< The property is visible and editable
+ Disabled, //!< The property is visible but non-editable
+ Hidden, //!< The property is invisible
+
+ Default = Enabled
+ };
+
+ struct MaterialPropertyRange
+ {
+ MaterialPropertyRange() = default;
+ MaterialPropertyRange(
+ const MaterialPropertyValue& max,
+ const MaterialPropertyValue& min,
+ const MaterialPropertyValue& softMax,
+ const MaterialPropertyValue& softMin
+ )
+ : m_max(max)
+ , m_min(min)
+ , m_softMax(softMax)
+ , m_softMin(softMin)
+ {}
+
+ MaterialPropertyValue m_max;
+ MaterialPropertyValue m_min;
+ MaterialPropertyValue m_softMax;
+ MaterialPropertyValue m_softMin;
+ };
+
+ //! Used by material functors to dynamically control property metadata in tools.
+ //! For example, show/hide a property based on some other 'enable' flag property.
+ struct MaterialPropertyDynamicMetadata
+ {
+ AZ_TYPE_INFO(MaterialPropertyDynamicMetadata, "{A89F215F-3235-499F-896C-9E63ACC1D657}");
+
+ AZ::RPI::MaterialPropertyVisibility m_visibility;
+ AZStd::string m_description;
+ AZ::RPI::MaterialPropertyRange m_propertyRange;
+ };
+
+ //! Visibility for each material property group.
+ enum class MaterialPropertyGroupVisibility : uint32_t
+ {
+ // Note it's helpful to keep these values aligned with MaterialPropertyVisibility in part because in lua it would be easy to accidentally use
+ // MaterialPropertyVisibility instead of MaterialPropertyGroupVisibility resulting in sneaky bugs. Also, if the enums end up being the same in
+ // the future, we could just merge them into one.
+
+ Enabled, //!< The property is visible and editable
+ //Disabled, //!< The property is visible but non-editable (reserved for possible future use, to match MaterialPropertyVisibility)
+ Hidden=2, //!< The property is invisible
+
+ Default = Enabled
+ };
+
+ //! Used by material functors to dynamically control property group metadata in tools.
+ //! For example, show/hide an entire property group based on some 'enable' flag property.
+ struct MaterialPropertyGroupDynamicMetadata
+ {
+ AZ_TYPE_INFO(MaterialPropertyGroupDynamicMetadata, "{F94009F7-48A3-4CE0-AF64-D5A86890ACD4}");
+
+ AZ::RPI::MaterialPropertyGroupVisibility m_visibility;
+ };
+
+ void ReflectMaterialDynamicMetadata(ReflectContext* context);
+
+ } // namespace RPI
+
+ AZ_TYPE_INFO_SPECIALIZE(RPI::MaterialPropertyVisibility, "{318B43A2-79E3-4502-8FD0-5815209EA123}");
+ AZ_TYPE_INFO_SPECIALIZE(RPI::MaterialPropertyGroupVisibility, "{B803958B-DE64-4FBF-AC00-CF781611BE37}");
+} // namespace AZ
+
diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h
index d17c7634a2..6b9b34aa1b 100644
--- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h
+++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h
@@ -18,6 +18,7 @@
#include
#include
#include
+#include
namespace AZ
{
@@ -147,6 +148,8 @@ namespace AZ
public:
const MaterialPropertyDynamicMetadata* GetMaterialPropertyMetadata(const Name& propertyName) const;
const MaterialPropertyDynamicMetadata* GetMaterialPropertyMetadata(const MaterialPropertyIndex& index) const;
+
+ const MaterialPropertyGroupDynamicMetadata* GetMaterialPropertyGroupMetadata(const Name& propertyName) const;
//! Get the property value. The type must be one of those in MaterialPropertyValue.
//! Otherwise, a compile error will be reported.
@@ -178,6 +181,8 @@ namespace AZ
bool SetMaterialPropertySoftMaxValue(const Name& propertyName, const MaterialPropertyValue& max);
bool SetMaterialPropertySoftMaxValue(const MaterialPropertyIndex& index, const MaterialPropertyValue& max);
+
+ bool SetMaterialPropertyGroupVisibility(const Name& propertyGroupName, MaterialPropertyGroupVisibility visibility);
// [GFX TODO][ATOM-4168] Replace the workaround for unlink-able RPI.Public classes in MaterialFunctor
// const AZStd::vector&, AZStd::unordered_map&, RHI::ConstPtr
@@ -185,18 +190,23 @@ namespace AZ
EditorContext(
const AZStd::vector& propertyValues,
RHI::ConstPtr materialPropertiesLayout,
- AZStd::unordered_map& metadata,
- AZStd::unordered_set& outChangedProperties,
+ AZStd::unordered_map& propertyMetadata,
+ AZStd::unordered_map& propertyGroupMetadata,
+ AZStd::unordered_set& updatedPropertiesOut,
+ AZStd::unordered_set& updatedPropertyGroupsOut,
const MaterialPropertyFlags* materialPropertyDependencies
);
private:
- AZStd::list_iterator> QueryMaterialMetadata(const Name& propertyName) const;
+ AZStd::list_iterator> QueryMaterialPropertyMetadata(const Name& propertyName) const;
+ AZStd::list_iterator> QueryMaterialPropertyGroupMetadata(const Name& propertyGroupName) const;
const AZStd::vector& m_materialPropertyValues;
RHI::ConstPtr m_materialPropertiesLayout;
- AZStd::unordered_map& m_metadata;
- AZStd::unordered_set& m_outChangedProperties;
+ AZStd::unordered_map& m_propertyMetadata;
+ AZStd::unordered_map& m_propertyGroupMetadata;
+ AZStd::unordered_set& m_updatedPropertiesOut;
+ AZStd::unordered_set& m_updatedPropertyGroupsOut;
const MaterialPropertyFlags* m_materialPropertyDependencies = nullptr;
};
diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyDescriptor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyDescriptor.h
index d73ce2334b..fab72d5f96 100644
--- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyDescriptor.h
+++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyDescriptor.h
@@ -81,52 +81,6 @@ namespace AZ
AZStd::string GetMaterialPropertyDataTypeString(AZ::TypeId typeId);
- //! Visibility for each material property.
- //! If the data field is empty, use default as editable.
- enum class MaterialPropertyVisibility : uint32_t
- {
- Enabled, //< The property is visible and editable
- Disabled, //< The property is visible but non-editable
- Hidden, //< The property is invisible
-
- Default = Enabled
- };
-
- struct MaterialPropertyRange
- {
- MaterialPropertyRange() = default;
- MaterialPropertyRange(
- const MaterialPropertyValue& max,
- const MaterialPropertyValue& min,
- const MaterialPropertyValue& softMax,
- const MaterialPropertyValue& softMin
- )
- : m_max(max)
- , m_min(min)
- , m_softMax(softMax)
- , m_softMin(softMin)
- {}
-
- MaterialPropertyValue m_max;
- MaterialPropertyValue m_min;
- MaterialPropertyValue m_softMax;
- MaterialPropertyValue m_softMin;
- };
-
- //! Used by material functors to dynamically control property metadata in tools.
- //! For example, show/hide a property based on some other 'enable' flag property.
- //! Normally we wouldn't want editor-related code mixed in with runtime code, but
- //! since this data can be modified dynamically, keeping it in the runtime makes
- //! the overall material functor design simpler and more user-friendly.
- struct MaterialPropertyDynamicMetadata
- {
- AZ_TYPE_INFO(MaterialPropertyDynamicMetadata, "{A89F215F-3235-499F-896C-9E63ACC1D657}");
-
- AZ::RPI::MaterialPropertyVisibility m_visibility;
- AZStd::string m_description;
- AZ::RPI::MaterialPropertyRange m_propertyRange;
- };
-
//! A material property is any data input to a material, like a bool, float, Vector, Image, Buffer, etc.
//! This descriptor defines a single input property, including it's name ID, and how it maps
//! to the shader system.
@@ -171,7 +125,6 @@ namespace AZ
} // namespace RPI
AZ_TYPE_INFO_SPECIALIZE(RPI::MaterialPropertyOutputType, "{42A6E5E8-0FE6-4D7B-884A-1F478E4ADD97}");
- AZ_TYPE_INFO_SPECIALIZE(RPI::MaterialPropertyVisibility, "{318B43A2-79E3-4502-8FD0-5815209EA123}");
AZ_TYPE_INFO_SPECIALIZE(RPI::MaterialPropertyDataType, "{3D903D5C-C6AA-452E-A2F8-8948D30833FF}");
} // namespace AZ
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Material/MaterialSystem.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Material/MaterialSystem.cpp
index e7e04b271d..f1751a02e2 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Public/Material/MaterialSystem.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Material/MaterialSystem.cpp
@@ -32,6 +32,7 @@ namespace AZ
MaterialPropertiesLayout::Reflect(context);
MaterialFunctor::Reflect(context);
LuaMaterialFunctor::Reflect(context);
+ ReflectMaterialDynamicMetadata(context);
}
void MaterialSystem::GetAssetHandlers(AssetHandlerPtrList& assetHandlers)
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp
index 7ab3489666..7db5f12560 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp
@@ -63,6 +63,7 @@ namespace AZ
behaviorContext->Class();
MaterialPropertyDescriptor::Reflect(behaviorContext);
+ ReflectMaterialDynamicMetadata(behaviorContext);
LuaMaterialFunctorRenderStates::Reflect(behaviorContext);
LuaMaterialFunctorShaderItem::Reflect(behaviorContext);
@@ -255,7 +256,7 @@ namespace AZ
// Specialize for type Image* because that will be more intuitive within Lua.
// The script can then check the result for nil without calling "get()".
- // For example, "GetMaterialPropertyValue_image(name) == nil" rather than "GetMaterialPropertyValue_image(name):get() == nil"
+ // For example, "GetMaterialPropertyValue_Image(name) == nil" rather than "GetMaterialPropertyValue_Image(name):get() == nil"
template<>
Image* LuaMaterialFunctorCommonContext::GetMaterialPropertyValue(const char* name) const
{
@@ -278,7 +279,7 @@ namespace AZ
->Method("GetMaterialPropertyValue_Vector3", &LuaMaterialFunctorRuntimeContext::GetMaterialPropertyValue)
->Method("GetMaterialPropertyValue_Vector4", &LuaMaterialFunctorRuntimeContext::GetMaterialPropertyValue)
->Method("GetMaterialPropertyValue_Color", &LuaMaterialFunctorRuntimeContext::GetMaterialPropertyValue)
- ->Method("GetMaterialPropertyValue_image", &LuaMaterialFunctorRuntimeContext::GetMaterialPropertyValue)
+ ->Method("GetMaterialPropertyValue_Image", &LuaMaterialFunctorRuntimeContext::GetMaterialPropertyValue)
->Method("SetShaderConstant_bool", &LuaMaterialFunctorRuntimeContext::SetShaderConstant)
->Method("SetShaderConstant_int", &LuaMaterialFunctorRuntimeContext::SetShaderConstant)
->Method("SetShaderConstant_uint", &LuaMaterialFunctorRuntimeContext::SetShaderConstant)
@@ -436,7 +437,7 @@ namespace AZ
->Method("GetMaterialPropertyValue_Vector3", &LuaMaterialFunctorEditorContext::GetMaterialPropertyValue)
->Method("GetMaterialPropertyValue_Vector4", &LuaMaterialFunctorEditorContext::GetMaterialPropertyValue)
->Method("GetMaterialPropertyValue_Color", &LuaMaterialFunctorEditorContext::GetMaterialPropertyValue)
- ->Method("GetMaterialPropertyValue_image", &LuaMaterialFunctorEditorContext::GetMaterialPropertyValue)
+ ->Method("GetMaterialPropertyValue_Image", &LuaMaterialFunctorEditorContext::GetMaterialPropertyValue)
->Method("SetMaterialPropertyVisibility", &LuaMaterialFunctorEditorContext::SetMaterialPropertyVisibility)
->Method("SetMaterialPropertyDescription", &LuaMaterialFunctorEditorContext::SetMaterialPropertyDescription)
->Method("SetMaterialPropertyMinValue_int", &LuaMaterialFunctorEditorContext::SetMaterialPropertyMinValue)
@@ -451,6 +452,7 @@ namespace AZ
->Method("SetMaterialPropertySoftMaxValue_int", &LuaMaterialFunctorEditorContext::SetMaterialPropertySoftMaxValue)
->Method("SetMaterialPropertySoftMaxValue_uint", &LuaMaterialFunctorEditorContext::SetMaterialPropertySoftMaxValue)
->Method("SetMaterialPropertySoftMaxValue_float", &LuaMaterialFunctorEditorContext::SetMaterialPropertySoftMaxValue)
+ ->Method("SetMaterialPropertyGroupVisibility", &LuaMaterialFunctorEditorContext::SetMaterialPropertyGroupVisibility)
;
}
@@ -524,6 +526,15 @@ namespace AZ
return m_editorContextImpl->SetMaterialPropertySoftMaxValue(index, value);
}
+
+ bool LuaMaterialFunctorEditorContext::SetMaterialPropertyGroupVisibility(const char* name, MaterialPropertyGroupVisibility visibility)
+ {
+ if (m_editorContextImpl)
+ {
+ return m_editorContextImpl->SetMaterialPropertyGroupVisibility(Name{m_propertyNamePrefix + name}, visibility);
+ }
+ return false;
+ }
bool LuaMaterialFunctorEditorContext::SetMaterialPropertyVisibility(const char* name, MaterialPropertyVisibility visibility)
{
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialDynamicMetadata.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialDynamicMetadata.cpp
new file mode 100644
index 0000000000..5c8f4ccc02
--- /dev/null
+++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialDynamicMetadata.cpp
@@ -0,0 +1,50 @@
+/*
+* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+* its licensors.
+*
+* For complete copyright and license terms please see the LICENSE at the root of this
+* distribution (the "License"). All use of this software is governed by the License,
+* or, if provided, by the license below or the license accompanying this file. Do not
+* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*
+*/
+
+#include
+#include
+
+namespace AZ
+{
+ namespace RPI
+ {
+ void ReflectMaterialDynamicMetadata(ReflectContext* context)
+ {
+ if (auto* serializeContext = azrtti_cast(context))
+ {
+ serializeContext->Enum()
+ ->Value("Enabled", MaterialPropertyVisibility::Enabled)
+ ->Value("Disabled", MaterialPropertyVisibility::Disabled)
+ ->Value("Hidden", MaterialPropertyVisibility::Hidden)
+ ;
+
+ serializeContext->Enum()
+ ->Value("Enabled", MaterialPropertyGroupVisibility::Enabled)
+ ->Value("Hidden", MaterialPropertyGroupVisibility::Hidden)
+ ;
+ }
+
+ if (auto* behaviorContext = azrtti_cast(context))
+ {
+ behaviorContext
+ ->Enum<(int)MaterialPropertyVisibility::Enabled>("MaterialPropertyVisibility_Enabled")
+ ->Enum<(int)MaterialPropertyVisibility::Disabled>("MaterialPropertyVisibility_Disabled")
+ ->Enum<(int)MaterialPropertyVisibility::Hidden>("MaterialPropertyVisibility_Hidden");
+
+ behaviorContext
+ ->Enum<(int)MaterialPropertyGroupVisibility::Enabled>("MaterialPropertyGroupVisibility_Enabled")
+ ->Enum<(int)MaterialPropertyGroupVisibility::Hidden>("MaterialPropertyGroupVisibility_Hidden");
+ }
+ }
+
+ } // namespace RPI
+} // namespace AZ
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
index 32772e9dd5..ab18a1fb66 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
@@ -142,21 +142,25 @@ namespace AZ
MaterialFunctor::EditorContext::EditorContext(
const AZStd::vector& propertyValues,
RHI::ConstPtr materialPropertiesLayout,
- AZStd::unordered_map& metadata,
- AZStd::unordered_set& outChangedProperties,
+ AZStd::unordered_map& propertyMetadata,
+ AZStd::unordered_map& propertyGroupMetadata,
+ AZStd::unordered_set& updatedPropertiesOut,
+ AZStd::unordered_set& updatedPropertyGroupsOut,
const MaterialPropertyFlags* materialPropertyDependencies
)
: m_materialPropertyValues(propertyValues)
, m_materialPropertiesLayout(materialPropertiesLayout)
- , m_metadata(metadata)
- , m_outChangedProperties(outChangedProperties)
+ , m_propertyMetadata(propertyMetadata)
+ , m_propertyGroupMetadata(propertyGroupMetadata)
+ , m_updatedPropertiesOut(updatedPropertiesOut)
+ , m_updatedPropertyGroupsOut(updatedPropertyGroupsOut)
, m_materialPropertyDependencies(materialPropertyDependencies)
{}
const MaterialPropertyDynamicMetadata* MaterialFunctor::EditorContext::GetMaterialPropertyMetadata(const Name& propertyName) const
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return nullptr;
}
@@ -168,11 +172,38 @@ namespace AZ
const Name& name = m_materialPropertiesLayout->GetPropertyDescriptor(index)->GetName();
return GetMaterialPropertyMetadata(name);
}
+
+ const MaterialPropertyGroupDynamicMetadata* MaterialFunctor::EditorContext::GetMaterialPropertyGroupMetadata(const Name& propertyName) const
+ {
+ auto it = QueryMaterialPropertyGroupMetadata(propertyName);
+ if (it == m_propertyGroupMetadata.end())
+ {
+ return nullptr;
+ }
+ return &(it->second);
+ }
+
+ bool MaterialFunctor::EditorContext::SetMaterialPropertyGroupVisibility(const Name& propertyGroupName, MaterialPropertyGroupVisibility visibility)
+ {
+ auto it = QueryMaterialPropertyGroupMetadata(propertyGroupName);
+ if (it == m_propertyGroupMetadata.end())
+ {
+ return false;
+ }
+ MaterialPropertyGroupVisibility originValue = it->second.m_visibility;
+ it->second.m_visibility = visibility;
+ if (originValue != visibility)
+ {
+ m_updatedPropertyGroupsOut.insert(propertyGroupName);
+ }
+
+ return true;
+ }
bool MaterialFunctor::EditorContext::SetMaterialPropertyVisibility(const Name& propertyName, MaterialPropertyVisibility visibility)
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return false;
}
@@ -180,7 +211,7 @@ namespace AZ
it->second.m_visibility = visibility;
if (originValue != visibility)
{
- m_outChangedProperties.insert(propertyName);
+ m_updatedPropertiesOut.insert(propertyName);
}
return true;
@@ -194,8 +225,8 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyDescription(const Name& propertyName, AZStd::string description)
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return false;
}
@@ -204,7 +235,7 @@ namespace AZ
it->second.m_description = description;
if (origin != description)
{
- m_outChangedProperties.insert(propertyName);
+ m_updatedPropertiesOut.insert(propertyName);
}
return true;
@@ -218,8 +249,8 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyMinValue(const Name& propertyName, const MaterialPropertyValue& min)
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return false;
}
@@ -229,7 +260,7 @@ namespace AZ
if(origin != min)
{
- m_outChangedProperties.insert(propertyName);
+ m_updatedPropertiesOut.insert(propertyName);
}
return true;
@@ -243,8 +274,8 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyMaxValue(const Name& propertyName, const MaterialPropertyValue& max)
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return false;
}
@@ -254,7 +285,7 @@ namespace AZ
if (origin != max)
{
- m_outChangedProperties.insert(propertyName);
+ m_updatedPropertiesOut.insert(propertyName);
}
return true;
@@ -268,8 +299,8 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertySoftMinValue(const Name& propertyName, const MaterialPropertyValue& min)
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return false;
}
@@ -279,7 +310,7 @@ namespace AZ
if (origin != min)
{
- m_outChangedProperties.insert(propertyName);
+ m_updatedPropertiesOut.insert(propertyName);
}
return true;
@@ -293,8 +324,8 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertySoftMaxValue(const Name& propertyName, const MaterialPropertyValue& max)
{
- auto it = QueryMaterialMetadata(propertyName);
- if (it == m_metadata.end())
+ auto it = QueryMaterialPropertyMetadata(propertyName);
+ if (it == m_propertyMetadata.end())
{
return false;
}
@@ -304,7 +335,7 @@ namespace AZ
if (origin != max)
{
- m_outChangedProperties.insert(propertyName);
+ m_updatedPropertiesOut.insert(propertyName);
}
return true;
@@ -316,16 +347,27 @@ namespace AZ
return SetMaterialPropertySoftMaxValue(name, max);
}
- AZStd::list_iterator> MaterialFunctor::EditorContext::QueryMaterialMetadata(const Name& propertyName) const
+ AZStd::list_iterator> MaterialFunctor::EditorContext::QueryMaterialPropertyMetadata(const Name& propertyName) const
{
- auto it = m_metadata.find(propertyName);
- if (it == m_metadata.end())
+ auto it = m_propertyMetadata.find(propertyName);
+ if (it == m_propertyMetadata.end())
{
AZ_Error("MaterialFunctor", false, "Couldn't find metadata for material property: %s.", propertyName.GetCStr());
}
return it;
}
+
+ AZStd::list_iterator> MaterialFunctor::EditorContext::QueryMaterialPropertyGroupMetadata(const Name& propertyGroupName) const
+ {
+ auto it = m_propertyGroupMetadata.find(propertyGroupName);
+ if (it == m_propertyGroupMetadata.end())
+ {
+ AZ_Error("MaterialFunctor", false, "Couldn't find metadata for material property group: %s.", propertyGroupName.GetCStr());
+ }
+
+ return it;
+ }
template
const Type& MaterialFunctor::RuntimeContext::GetMaterialPropertyValue(const MaterialPropertyIndex& index) const
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyDescriptor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyDescriptor.cpp
index 367d95357b..72d658db63 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyDescriptor.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyDescriptor.cpp
@@ -124,12 +124,6 @@ namespace AZ
->Value(ToString(MaterialPropertyOutputType::ShaderOption), MaterialPropertyOutputType::ShaderOption)
;
- serializeContext->Enum()
- ->Value("Enabled", MaterialPropertyVisibility::Enabled)
- ->Value("Disabled", MaterialPropertyVisibility::Disabled)
- ->Value("Hidden", MaterialPropertyVisibility::Hidden)
- ;
-
serializeContext->Enum()
->Value(ToString(MaterialPropertyDataType::Invalid), MaterialPropertyDataType::Invalid)
->Value(ToString(MaterialPropertyDataType::Bool), MaterialPropertyDataType::Bool)
@@ -153,14 +147,6 @@ namespace AZ
;
}
- if (auto* behaviorContext = azrtti_cast(context))
- {
- behaviorContext
- ->Enum<(int)MaterialPropertyVisibility::Enabled>("MaterialPropertyVisibility_Enabled")
- ->Enum<(int)MaterialPropertyVisibility::Disabled>("MaterialPropertyVisibility_Disabled")
- ->Enum<(int)MaterialPropertyVisibility::Hidden>("MaterialPropertyVisibility_Hidden");
- }
-
MaterialPropertyIndex::Reflect(context);
}
diff --git a/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp
index 76fa6bfb0e..3dcbdfce07 100644
--- a/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp
+++ b/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp
@@ -748,12 +748,15 @@ namespace UnitTest
MaterialPropertyDataType::UInt, "general.mode",
MaterialPropertyDataType::Float, "general.value",
functorScript);
-
+
AZStd::unordered_set changedPropertyNames;
-
AZStd::unordered_map propertyDynamicMetadata;
propertyDynamicMetadata[Name{"general.mode"}] = {};
propertyDynamicMetadata[Name{"general.value"}] = {};
+
+ AZStd::unordered_set changedPropertyGroupNames;
+ AZStd::unordered_map propertyGroupDynamicMetadata;
+ propertyGroupDynamicMetadata[Name{"general"}] = {};
Ptr functor = testData.GetMaterialTypeAsset()->GetMaterialFunctors()[0];
@@ -761,7 +764,9 @@ namespace UnitTest
testData.GetMaterial()->GetPropertyValues(),
testData.GetMaterial()->GetMaterialPropertiesLayout(),
propertyDynamicMetadata,
+ propertyGroupDynamicMetadata,
changedPropertyNames,
+ changedPropertyGroupNames,
&functor->GetMaterialPropertyDependencies()
);
@@ -814,10 +819,13 @@ namespace UnitTest
functorScript);
AZStd::unordered_set changedPropertyNames;
-
AZStd::unordered_map propertyDynamicMetadata;
propertyDynamicMetadata[Name{"general.units"}] = {};
propertyDynamicMetadata[Name{"general.distance"}] = {};
+
+ AZStd::unordered_set changedPropertyGroupNames;
+ AZStd::unordered_map propertyGroupDynamicMetadata;
+ propertyGroupDynamicMetadata[Name{"general"}] = {};
Ptr functor = testData.GetMaterialTypeAsset()->GetMaterialFunctors()[0];
@@ -825,7 +833,9 @@ namespace UnitTest
testData.GetMaterial()->GetPropertyValues(),
testData.GetMaterial()->GetMaterialPropertiesLayout(),
propertyDynamicMetadata,
+ propertyGroupDynamicMetadata,
changedPropertyNames,
+ changedPropertyGroupNames,
&functor->GetMaterialPropertyDependencies()
);
@@ -845,6 +855,66 @@ namespace UnitTest
EXPECT_EQ(-100.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_softMin.GetValue());
EXPECT_EQ(100.0f, propertyDynamicMetadata[Name{"general.distance"}].m_propertyRange.m_softMax.GetValue());
}
+
+ TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_EditorContext_SetMaterialPropertyGroupVisibility)
+ {
+ using namespace AZ::RPI;
+
+ const char* functorScript =
+ R"(
+ function GetMaterialPropertyDependencies()
+ return { "general.mode" }
+ end
+
+ function ProcessEditor(context)
+ local mode = context:GetMaterialPropertyValue_uint("general.mode")
+
+ if (mode == 1) then
+ context:SetMaterialPropertyGroupVisibility("otherGroup", MaterialPropertyGroupVisibility_Enabled)
+ else
+ context:SetMaterialPropertyGroupVisibility("otherGroup", MaterialPropertyGroupVisibility_Hidden)
+ end
+ end
+ )";
+
+ TestMaterialData testData;
+ testData.Setup(
+ MaterialPropertyDataType::UInt, "general.mode",
+ MaterialPropertyDataType::Float, "otherGroup.value",
+ functorScript);
+
+ AZStd::unordered_set changedPropertyNames;
+ AZStd::unordered_map propertyDynamicMetadata;
+ propertyDynamicMetadata[Name{"general.mode"}] = {};
+ propertyDynamicMetadata[Name{"otherGroup.value"}] = {};
+
+ AZStd::unordered_set changedPropertyGroupNames;
+ AZStd::unordered_map propertyGroupDynamicMetadata;
+ propertyGroupDynamicMetadata[Name{"general"}] = {};
+ propertyGroupDynamicMetadata[Name{"otherGroup"}] = {};
+
+ Ptr functor = testData.GetMaterialTypeAsset()->GetMaterialFunctors()[0];
+
+ AZ::RPI::MaterialFunctor::EditorContext context = AZ::RPI::MaterialFunctor::EditorContext(
+ testData.GetMaterial()->GetPropertyValues(),
+ testData.GetMaterial()->GetMaterialPropertiesLayout(),
+ propertyDynamicMetadata,
+ propertyGroupDynamicMetadata,
+ changedPropertyNames,
+ changedPropertyGroupNames,
+ &functor->GetMaterialPropertyDependencies()
+ );
+
+ testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{0u});
+ functor->Process(context);
+ EXPECT_EQ(MaterialPropertyGroupVisibility::Enabled, propertyGroupDynamicMetadata[Name{"general"}].m_visibility);
+ EXPECT_EQ(MaterialPropertyGroupVisibility::Hidden, propertyGroupDynamicMetadata[Name{"otherGroup"}].m_visibility);
+
+ testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{1u});
+ functor->Process(context);
+ EXPECT_EQ(MaterialPropertyGroupVisibility::Enabled, propertyGroupDynamicMetadata[Name{"general"}].m_visibility);
+ EXPECT_EQ(MaterialPropertyGroupVisibility::Enabled, propertyGroupDynamicMetadata[Name{"otherGroup"}].m_visibility);
+ }
TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_SetRenderStates)
{
diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp
index 5a81ebb74d..d32c285780 100644
--- a/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp
+++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp
@@ -29,6 +29,7 @@ namespace JsonSerializationTests
{
AZ::RPI::MaterialTypeSourceData::Reflect(context.get());
AZ::RPI::MaterialPropertyDescriptor::Reflect(context.get());
+ AZ::RPI::ReflectMaterialDynamicMetadata(context.get());
}
void Reflect(AZStd::unique_ptr& context)
diff --git a/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake b/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake
index d1db00aa34..307f3a046b 100644
--- a/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake
+++ b/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake
@@ -55,6 +55,7 @@ set(FILES
Include/Atom/RPI.Reflect/Material/MaterialAsset.h
Include/Atom/RPI.Reflect/Material/MaterialAssetCreatorCommon.h
Include/Atom/RPI.Reflect/Material/MaterialAssetCreator.h
+ Include/Atom/RPI.Reflect/Material/MaterialDynamicMetadata.h
Include/Atom/RPI.Reflect/Material/MaterialPropertyDescriptor.h
Include/Atom/RPI.Reflect/Material/MaterialPropertiesLayout.h
Include/Atom/RPI.Reflect/Material/MaterialPropertyValue.h
@@ -135,6 +136,7 @@ set(FILES
Source/RPI.Reflect/Material/MaterialAssetCreatorCommon.cpp
Source/RPI.Reflect/Material/MaterialAssetCreator.cpp
Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp
+ Source/RPI.Reflect/Material/MaterialDynamicMetadata.cpp
Source/RPI.Reflect/Material/MaterialPropertyDescriptor.cpp
Source/RPI.Reflect/Material/MaterialPropertiesLayout.cpp
Source/RPI.Reflect/Material/MaterialTypeAsset.cpp
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h
index b17a25a675..17ca1c8d04 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h
@@ -38,8 +38,8 @@ namespace AtomToolsFramework
Count
};
- // Configures the initial state, data type, attributes, and values that describe
- // the dynamic property and how it is presented
+ //! Configures the initial state, data type, attributes, and values that describe
+ //! the dynamic property and how it is presented
struct DynamicPropertyConfig
{
AZ_TYPE_INFO(DynamicPropertyConfig, "{9CA40E92-7F03-42BE-B6AA-51F30EE5796C}");
@@ -98,7 +98,7 @@ namespace AtomToolsFramework
//! Returns true if the property has a valid value.
bool IsValid() const;
- //! Returns the ID of the property.
+ //! Returns the ID of the property.
const AZ::Name GetId() const;
//! Returns the current property visibility.
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h
index 81b512faf2..0403c06f87 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h
@@ -44,6 +44,12 @@ namespace AtomToolsFramework
const AZStd::string& groupDescription,
QWidget* groupWidget) = 0;
+ //! Sets the visibility of a specific property group. This impacts both the header and the widget.
+ virtual void SetGroupVisible(const AZStd::string& groupNameId, bool visible) = 0;
+
+ //! Returns the visibility of a specific property group.
+ virtual bool IsGroupVisible(const AZStd::string& groupNameId) const = 0;
+
//! Calls Refresh for a specific InspectorGroupWidget, allowing for non-destructive UI changes
virtual void RefreshGroup(const AZStd::string& groupNameId) = 0;
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h
index b0932b3b04..5559b51462 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h
@@ -57,6 +57,9 @@ namespace AtomToolsFramework
const AZStd::string& groupDescription,
QWidget* groupWidget) override;
+ void SetGroupVisible(const AZStd::string& groupNameId, bool visible) override;
+ bool IsGroupVisible(const AZStd::string& groupNameId) const override;
+
void RefreshGroup(const AZStd::string& groupNameId) override;
void RebuildGroup(const AZStd::string& groupNameId) override;
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
index ec5f9893bd..c1ccfb4616 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
@@ -69,6 +69,7 @@ namespace AtomToolsFramework
InspectorGroupHeaderWidget* groupHeader = new InspectorGroupHeaderWidget(m_ui->m_propertyContent);
groupHeader->setText(groupDisplayName.c_str());
groupHeader->setToolTip(groupDescription.c_str());
+ groupHeader->setObjectName(groupNameId.c_str());
m_layout->addWidget(groupHeader);
m_headers.push_back(groupHeader);
@@ -81,6 +82,32 @@ namespace AtomToolsFramework
OnHeaderClicked(event, groupHeader, groupWidget);
});
}
+
+ void InspectorWidget::SetGroupVisible(const AZStd::string& groupNameId, bool visible)
+ {
+ for (size_t i = 0; i < m_groups.size(); ++i)
+ {
+ if (m_groups[i]->objectName() == groupNameId.c_str())
+ {
+ m_headers[i]->setVisible(visible);
+ m_groups[i]->setVisible(visible && m_headers[i]->IsExpanded());
+ break;
+ }
+ }
+ }
+
+ bool InspectorWidget::IsGroupVisible(const AZStd::string& groupNameId) const
+ {
+ for (auto& header : m_headers)
+ {
+ if (header->objectName() == groupNameId.c_str())
+ {
+ return header->isVisible();
+ }
+ }
+
+ return false;
+ }
void InspectorWidget::RefreshGroup(const AZStd::string& groupNameId)
{
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentNotificationBus.h b/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentNotificationBus.h
index 3c3c77a628..80e8054ec5 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentNotificationBus.h
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentNotificationBus.h
@@ -18,6 +18,7 @@
#include
#include
+#include
namespace MaterialEditor
{
@@ -77,6 +78,12 @@ namespace MaterialEditor
//! @param documentId unique id of material document for which the notification is sent
//! @param property object containing the property value and configuration that was modified
virtual void OnDocumentPropertyConfigModified([[maybe_unused]] const AZ::Uuid& documentId, [[maybe_unused]] const AtomToolsFramework::DynamicProperty& property) {}
+
+ //! Signal that the property group visibility has been changed.
+ //! @param documentId unique id of material document for which the notification is sent
+ //! @param groupId id of the group that changed
+ //! @param visible whether the property group is visible
+ virtual void OnDocumentPropertyGroupVisibilityChanged([[maybe_unused]] const AZ::Uuid& documentId, [[maybe_unused]] const AZ::Name& groupId, [[maybe_unused]] bool visible) {}
};
using MaterialDocumentNotificationBus = AZ::EBus;
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentRequestBus.h b/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentRequestBus.h
index dad21a6348..c71d500d8c 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentRequestBus.h
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Include/Atom/Document/MaterialDocumentRequestBus.h
@@ -19,6 +19,7 @@
#include
#include
+#include
namespace AZ
{
@@ -67,6 +68,10 @@ namespace MaterialEditor
//! Returns a property object
//! If the document is not open or the id can't be found, an invalid property is returned.
virtual const AtomToolsFramework::DynamicProperty& GetProperty(const AZ::Name& propertyFullName) const = 0;
+
+ //! Returns whether a property group is visible
+ //! If the document is not open or the id can't be found, returns false.
+ virtual bool IsPropertyGroupVisible(const AZ::Name& propertyGroupFullName) const = 0;
//! Modify material property value
virtual void SetPropertyValue(const AZ::Name& propertyFullName, const AZStd::any& value) = 0;
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp
index 288530a4e4..fec70763dd 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp
@@ -117,6 +117,24 @@ namespace MaterialEditor
const AtomToolsFramework::DynamicProperty& property = it->second;
return property;
}
+
+ bool MaterialDocument::IsPropertyGroupVisible(const AZ::Name& propertyGroupFullName) const
+ {
+ if (!IsOpen())
+ {
+ AZ_Error("MaterialDocument", false, "Material document is not open.");
+ return false;
+ }
+
+ const auto it = m_propertyGroupVisibility.find(propertyGroupFullName);
+ if (it == m_propertyGroupVisibility.end())
+ {
+ AZ_Error("MaterialDocument", false, "Material document property group could not be found: '%s'.", propertyGroupFullName.GetCStr());
+ return false;
+ }
+
+ return it->second;
+ }
void MaterialDocument::SetPropertyValue(const AZ::Name& propertyFullName, const AZStd::any& value)
{
@@ -153,8 +171,12 @@ namespace MaterialEditor
Recompile();
- AZStd::unordered_set changedPropertyNames = RunEditorMaterialFunctors(dirtyFlags);
- for (const Name& changedPropertyName : changedPropertyNames)
+ EditorMaterialFunctorResult result = RunEditorMaterialFunctors(dirtyFlags);
+ for (const Name& changedPropertyGroupName : result.m_updatedPropertyGroups)
+ {
+ MaterialDocumentNotificationBus::Broadcast(&MaterialDocumentNotificationBus::Events::OnDocumentPropertyGroupVisibilityChanged, m_id, changedPropertyGroupName, IsPropertyGroupVisible(changedPropertyGroupName));
+ }
+ for (const Name& changedPropertyName : result.m_updatedProperties)
{
MaterialDocumentNotificationBus::Broadcast(&MaterialDocumentNotificationBus::Events::OnDocumentPropertyConfigModified, m_id, GetProperty(changedPropertyName));
}
@@ -782,6 +804,12 @@ namespace MaterialEditor
return true;
});
+ // Populate the property group visibility map
+ for (MaterialTypeSourceData::GroupDefinition& group : m_materialTypeSourceData.GetGroupDefinitionsInDisplayOrder())
+ {
+ m_propertyGroupVisibility[AZ::Name{group.m_nameId}] = true;
+ }
+
// Adding properties for material type and parent as part of making dynamic
// properties and the inspector more general purpose.
// This allows the read only properties to appear in the inspector like any
@@ -914,16 +942,26 @@ namespace MaterialEditor
}
}
- AZStd::unordered_set MaterialDocument::RunEditorMaterialFunctors(AZ::RPI::MaterialPropertyFlags dirtyFlags)
+ MaterialDocument::EditorMaterialFunctorResult MaterialDocument::RunEditorMaterialFunctors(AZ::RPI::MaterialPropertyFlags dirtyFlags)
{
- AZStd::unordered_set changedPropertyNames;
+ EditorMaterialFunctorResult result;
+
AZStd::unordered_map propertyDynamicMetadata;
+ AZStd::unordered_map propertyGroupDynamicMetadata;
for (auto& propertyPair : m_properties)
{
AtomToolsFramework::DynamicProperty& property = propertyPair.second;
AtomToolsFramework::ConvertToPropertyMetaData(propertyDynamicMetadata[property.GetId()], property.GetConfig());
}
+ for (auto& groupPair : m_propertyGroupVisibility)
+ {
+ AZ::RPI::MaterialPropertyGroupDynamicMetadata& metadata = propertyGroupDynamicMetadata[AZ::Name{groupPair.first}];
+ bool visible = groupPair.second;
+ metadata.m_visibility = visible ?
+ AZ::RPI::MaterialPropertyGroupVisibility::Enabled : AZ::RPI::MaterialPropertyGroupVisibility::Hidden;
+ }
+
for (AZ::RPI::Ptr& functor : m_editorFunctors)
{
const AZ::RPI::MaterialPropertyFlags& materialPropertyDependencies = functor->GetMaterialPropertyDependencies();
@@ -935,7 +973,9 @@ namespace MaterialEditor
m_materialInstance->GetPropertyValues(),
m_materialInstance->GetMaterialPropertiesLayout(),
propertyDynamicMetadata,
- changedPropertyNames,
+ propertyGroupDynamicMetadata,
+ result.m_updatedProperties,
+ result.m_updatedPropertyGroups,
&materialPropertyDependencies
);
functor->Process(context);
@@ -950,7 +990,13 @@ namespace MaterialEditor
property.SetConfig(propertyConfig);
}
- return changedPropertyNames;
+ for (auto& updatedPropertyGroup : result.m_updatedPropertyGroups)
+ {
+ bool visible = propertyGroupDynamicMetadata[updatedPropertyGroup].m_visibility == AZ::RPI::MaterialPropertyGroupVisibility::Enabled;
+ m_propertyGroupVisibility[updatedPropertyGroup] = visible;
+ }
+
+ return result;
}
} // namespace MaterialEditor
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.h
index 3959e45ad7..42f48c95cd 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.h
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.h
@@ -56,6 +56,7 @@ namespace MaterialEditor
const AZ::RPI::MaterialTypeSourceData* GetMaterialTypeSourceData() const override;
const AZStd::any& GetPropertyValue(const AZ::Name& propertyFullName) const override;
const AtomToolsFramework::DynamicProperty& GetProperty(const AZ::Name& propertyFullName) const override;
+ bool IsPropertyGroupVisible(const AZ::Name& propertyGroupFullName) const override;
void SetPropertyValue(const AZ::Name& propertyFullName, const AZStd::any& value) override;
bool Open(AZStd::string_view loadPath) override;
bool Rebuild() override;
@@ -79,11 +80,14 @@ namespace MaterialEditor
// Predicate for evaluating properties
using PropertyFilterFunction = AZStd::function;
- // Map of documenmt's property
+ // Map of document's properties
using PropertyMap = AZStd::unordered_map;
// Map of raw property values for undo/redo comparison and storage
using PropertyValueMap = AZStd::unordered_map;
+
+ // Map of document's property group visibility flags
+ using PropertyGroupVisibilityMap = AZStd::unordered_map;
// Function to be bound for undo and redo
using UndoRedoFunction = AZStd::function;
@@ -119,10 +123,16 @@ namespace MaterialEditor
void RestorePropertyValues(const PropertyValueMap& propertyValues);
+ struct EditorMaterialFunctorResult
+ {
+ AZStd::unordered_set m_updatedProperties;
+ AZStd::unordered_set m_updatedPropertyGroups;
+ };
+
// Run editor material functor to update editor metadata.
// @param dirtyFlags indicates which properties have changed, and thus which MaterialFunctors need to be run.
- // @return names for the set of properties that have been changed or need update.
- AZStd::unordered_set RunEditorMaterialFunctors(AZ::RPI::MaterialPropertyFlags dirtyFlags);
+ // @return names for the set of properties and groups that have been changed or need update.
+ EditorMaterialFunctorResult RunEditorMaterialFunctors(AZ::RPI::MaterialPropertyFlags dirtyFlags);
// Unique id of this material document
AZ::Uuid m_id = AZ::Uuid::CreateRandom();
@@ -153,6 +163,9 @@ namespace MaterialEditor
// Collection of all material's properties
PropertyMap m_properties;
+
+ // Collection of all material's property groups
+ PropertyGroupVisibilityMap m_propertyGroupVisibility;
// Material functors that run in editor. See MaterialFunctor.h for details.
AZStd::vector> m_editorFunctors;
@@ -175,7 +188,7 @@ namespace MaterialEditor
int m_undoHistoryIndex = 0;
AZStd::any m_invalidValue;
-
+
AtomToolsFramework::DynamicProperty m_invalidProperty;
};
} // namespace MaterialEditor
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
index b066c3c7dd..0fd3a8e2a8 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
@@ -185,7 +185,7 @@ namespace MaterialEditor
}
}
- void MaterialInspector::OnDocumentPropertyConfigModified(const AZ::Uuid& documentId, const AtomToolsFramework::DynamicProperty& property)
+ void MaterialInspector::OnDocumentPropertyConfigModified(const AZ::Uuid&, const AtomToolsFramework::DynamicProperty& property)
{
for (auto& groupPair : m_groups)
{
@@ -197,18 +197,28 @@ namespace MaterialEditor
if (reflectedProperty.GetVisibility() != property.GetVisibility())
{
reflectedProperty.SetConfig(property.GetConfig());
- AtomToolsFramework::InspectorRequestBus::Event(documentId, &AtomToolsFramework::InspectorRequestBus::Events::RebuildGroup, groupPair.first);
+ RebuildGroup(groupPair.first);
}
else
{
reflectedProperty.SetConfig(property.GetConfig());
- AtomToolsFramework::InspectorRequestBus::Event(documentId, &AtomToolsFramework::InspectorRequestBus::Events::RefreshGroup, groupPair.first);
+ RefreshGroup(groupPair.first);
}
return;
}
}
}
}
+
+ void MaterialInspector::OnDocumentPropertyGroupVisibilityChanged(const AZ::Uuid&, const AZ::Name& groupId, bool visible)
+ {
+ auto groupIter = m_groups.find(groupId.GetStringView());
+
+ if(groupIter != m_groups.end())
+ {
+ SetGroupVisible(groupIter->first, visible);
+ }
+ }
void MaterialInspector::BeforePropertyModified(AzToolsFramework::InstanceDataNode* pNode)
{
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h
index efe979e5ea..65de41f240 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h
@@ -50,6 +50,7 @@ namespace MaterialEditor
void OnDocumentOpened(const AZ::Uuid& documentId) override;
void OnDocumentPropertyValueModified(const AZ::Uuid& documentId, const AtomToolsFramework::DynamicProperty& property) override;
void OnDocumentPropertyConfigModified(const AZ::Uuid& documentId, const AtomToolsFramework::DynamicProperty& property) override;
+ void OnDocumentPropertyGroupVisibilityChanged(const AZ::Uuid& documentId, const AZ::Name& groupId, bool visible) override;
// AzToolsFramework::IPropertyEditorNotify overrides...
void BeforePropertyModified(AzToolsFramework::InstanceDataNode* pNode) override;
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp
index 03533e142f..62f8a58fab 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp
@@ -288,15 +288,17 @@ namespace AZ
void MaterialPropertyInspector::RunEditorMaterialFunctors()
{
AZStd::unordered_set changedPropertyNames;
+ AZStd::unordered_set changedPropertyGroupNames;
// Convert editor property configuration data into material property meta data so that it can be used to execute functors
AZStd::unordered_map propertyDynamicMetadata;
- for (auto& group : m_groups)
+ AZStd::unordered_map propertyGroupDynamicMetadata;
+ for (auto& groupPair : m_groups)
{
- for (auto& property : group.second.m_properties)
- {
- AtomToolsFramework::ConvertToPropertyMetaData(propertyDynamicMetadata[property.GetId()], property.GetConfig());
- }
+ AZ::RPI::MaterialPropertyGroupDynamicMetadata& metadata = propertyGroupDynamicMetadata[AZ::Name{groupPair.first}];
+
+ metadata.m_visibility = IsGroupVisible(groupPair.first) ?
+ AZ::RPI::MaterialPropertyGroupVisibility::Enabled : AZ::RPI::MaterialPropertyGroupVisibility::Hidden;
}
for (AZ::RPI::Ptr& functor : m_editorFunctors)
@@ -310,7 +312,9 @@ namespace AZ
m_materialInstance->GetPropertyValues(),
m_materialInstance->GetMaterialPropertiesLayout(),
propertyDynamicMetadata,
+ propertyGroupDynamicMetadata,
changedPropertyNames,
+ changedPropertyGroupNames,
&materialPropertyDependencies
);
functor->Process(context);
@@ -319,9 +323,16 @@ namespace AZ
m_dirtyPropertyFlags.reset();
// Apply any changes to material property meta data back to the editor property configurations
- for (auto& group : m_groups)
+ for (auto& groupPair : m_groups)
{
- for (auto& property : group.second.m_properties)
+ AZ::Name groupName{groupPair.first};
+
+ if (changedPropertyGroupNames.find(groupName) != changedPropertyGroupNames.end())
+ {
+ SetGroupVisible(groupPair.first, propertyGroupDynamicMetadata[groupName].m_visibility == AZ::RPI::MaterialPropertyGroupVisibility::Enabled);
+ }
+
+ for (auto& property : groupPair.second.m_properties)
{
AtomToolsFramework::DynamicPropertyConfig propertyConfig = property.GetConfig();
From b225dcfa79a4ee9bfe48456899dba0632e632e24 Mon Sep 17 00:00:00 2001
From: moudgils
Date: Wed, 12 May 2021 19:37:44 -0700
Subject: [PATCH 015/132] Update cmake to use the new Dxc binaries for windows
---
cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake
index bdc93d9a0e..9b202f2eb2 100644
--- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake
+++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake
@@ -1,4 +1,4 @@
-#
+#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
@@ -28,8 +28,8 @@ ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform
ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665)
ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4)
ly_associate_package(PACKAGE_NAME SPIRVCross-2020.04.20-rev1-multiplatform TARGETS SPIRVCross PACKAGE_HASH 7c8c0eaa0166c26745c62d2238525af7e27ac058a5db3defdbaec1878e8798dd)
-ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-2020.08.07-rev1-multiplatform TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 04a6850ce03d4c16e19ed206f7093d885276dfb74047e6aa99f0a834c8b7cc73)
ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxcAz-5.0.0_az-rev1-multiplatform TARGETS DirectXShaderCompilerDxcAz PACKAGE_HASH 94f24989a7a371d840b513aa5ffaff02747b3d19b119bc1f899427e29978f753)
+ly_associate_package(PACKAGE_NAME DirectXShaderCompiler-2021.05.05-rev1-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH b2e34c4a19b8a996c1e488aeb83233abe1985b6502ef644516ef692029b98f6d)
ly_associate_package(PACKAGE_NAME azslc-1.7.20-rev1-multiplatform TARGETS azslc PACKAGE_HASH 45d55f28bea2ef823ed3204f60df52e5e329f42923923d4555fdbdf3bea0af60)
ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee)
ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5)
From e429c8e06a1638eb8ac2e29ae4fa5d5d0c2ec1c7 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Wed, 12 May 2021 23:28:05 -0700
Subject: [PATCH 016/132] Fixed issues after merging latest main, as well as
some edge cases I didn't notice before.
The structure of InspectorWidget::m_groups changed, so I had to update my new code accordingly.
Updated the InspectorWidget::m_groups code a bit to be more readable.
Discovered the initial property group visiblity state wasn't being set correctly when a material was first opened, so groups weren't initially hidden when they should have been. This had to be fixed in different ways for MaterialEditor's inspector and MaterialComponent's inspector.
ATOM-14688 Disable Individual Layers
---
.../Inspector/InspectorRequestBus.h | 7 ++-
.../Inspector/InspectorWidget.h | 10 +++-
.../Code/Source/Inspector/InspectorWidget.cpp | 50 +++++++++++--------
.../MaterialInspector/MaterialInspector.cpp | 5 ++
.../EditorMaterialComponentInspector.cpp | 7 ++-
5 files changed, 53 insertions(+), 26 deletions(-)
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h
index 442ff90f5b..d9b626f631 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h
@@ -47,8 +47,13 @@ namespace AtomToolsFramework
//! Sets the visibility of a specific property group. This impacts both the header and the widget.
virtual void SetGroupVisible(const AZStd::string& groupNameId, bool visible) = 0;
- //! Returns the visibility of a specific property group.
+ //! Returns whether a specific property is visible.
+ //! Note this follows the same rules as QWidget::isVisible(), meaning a group could be not visible due to the widget's parents being not visible.
virtual bool IsGroupVisible(const AZStd::string& groupNameId) const = 0;
+
+ //! Returns whether a specific property is explicitly hidden.
+ //! Note this follows the same rules as QWidget::isHidden(), meaning a group that is hidden will not become visible automatically when the parent becomes visible.
+ virtual bool IsGroupHidden(const AZStd::string& groupNameId) const = 0;
//! Calls Refresh for a specific InspectorGroupWidget, allowing for non-destructive UI changes
virtual void RefreshGroup(const AZStd::string& groupNameId) = 0;
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h
index 4e94de952c..5e41121b37 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h
@@ -59,6 +59,7 @@ namespace AtomToolsFramework
void SetGroupVisible(const AZStd::string& groupNameId, bool visible) override;
bool IsGroupVisible(const AZStd::string& groupNameId) const override;
+ bool IsGroupHidden(const AZStd::string& groupNameId) const override;
void RefreshGroup(const AZStd::string& groupNameId) override;
void RebuildGroup(const AZStd::string& groupNameId) override;
@@ -82,6 +83,13 @@ namespace AtomToolsFramework
private:
QVBoxLayout* m_layout = nullptr;
QScopedPointer m_ui;
- AZStd::unordered_map> m_groups;
+
+ struct GroupWidgetPair
+ {
+ InspectorGroupHeaderWidget* m_header;
+ QWidget* m_panel;
+ };
+
+ AZStd::unordered_map m_groups;
};
} // namespace AtomToolsFramework
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
index 94d4d95c24..83aed3c2ae 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
@@ -75,7 +75,7 @@ namespace AtomToolsFramework
groupWidget->setParent(m_ui->m_propertyContent);
m_layout->addWidget(groupWidget);
- m_groups[groupNameId] = AZStd::make_pair(groupHeader, groupWidget);
+ m_groups[groupNameId] = {groupHeader, groupWidget};
connect(groupHeader, &InspectorGroupHeaderWidget::clicked, this, [this, groupNameId](QMouseEvent* event) {
OnHeaderClicked(groupNameId, event);
@@ -95,25 +95,31 @@ namespace AtomToolsFramework
void InspectorWidget::SetGroupVisible(const AZStd::string& groupNameId, bool visible)
{
- for (size_t i = 0; i < m_groups.size(); ++i)
+ auto groupItr = m_groups.find(groupNameId);
+ if (groupItr != m_groups.end())
{
- if (m_groups[i]->objectName() == groupNameId.c_str())
- {
- m_headers[i]->setVisible(visible);
- m_groups[i]->setVisible(visible && m_headers[i]->IsExpanded());
- break;
- }
+ groupItr->second.m_header->setVisible(visible);
+ groupItr->second.m_panel->setVisible(visible && groupItr->second.m_header->IsExpanded());
}
}
bool InspectorWidget::IsGroupVisible(const AZStd::string& groupNameId) const
{
- for (auto& header : m_headers)
+ auto groupItr = m_groups.find(groupNameId);
+ if (groupItr != m_groups.end())
{
- if (header->objectName() == groupNameId.c_str())
- {
- return header->isVisible();
- }
+ return groupItr->second.m_header->isVisible();
+ }
+
+ return false;
+ }
+
+ bool InspectorWidget::IsGroupHidden(const AZStd::string& groupNameId) const
+ {
+ auto groupItr = m_groups.find(groupNameId);
+ if (groupItr != m_groups.end())
+ {
+ return groupItr->second.m_header->isHidden();
}
return false;
@@ -156,8 +162,8 @@ namespace AtomToolsFramework
auto groupItr = m_groups.find(groupNameId);
if (groupItr != m_groups.end())
{
- groupItr->second.first->SetExpanded(true);
- groupItr->second.second->setVisible(true);
+ groupItr->second.m_header->SetExpanded(true);
+ groupItr->second.m_panel->setVisible(true);
}
}
@@ -166,23 +172,23 @@ namespace AtomToolsFramework
auto groupItr = m_groups.find(groupNameId);
if (groupItr != m_groups.end())
{
- groupItr->second.first->SetExpanded(false);
- groupItr->second.second->setVisible(false);
+ groupItr->second.m_header->SetExpanded(false);
+ groupItr->second.m_panel->setVisible(false);
}
}
bool InspectorWidget::IsGroupExpanded(const AZStd::string& groupNameId) const
{
auto groupItr = m_groups.find(groupNameId);
- return groupItr != m_groups.end() ? groupItr->second.first->IsExpanded() : false;
+ return groupItr != m_groups.end() ? groupItr->second.m_header->IsExpanded() : false;
}
void InspectorWidget::ExpandAll()
{
for (auto& groupPair : m_groups)
{
- groupPair.second.first->SetExpanded(true);
- groupPair.second.second->setVisible(true);
+ groupPair.second.m_header->SetExpanded(true);
+ groupPair.second.m_panel->setVisible(true);
}
}
@@ -190,8 +196,8 @@ namespace AtomToolsFramework
{
for (auto& groupPair : m_groups)
{
- groupPair.second.first->SetExpanded(false);
- groupPair.second.second->setVisible(false);
+ groupPair.second.m_header->SetExpanded(false);
+ groupPair.second.m_panel->setVisible(false);
}
}
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
index 0492c9c150..19dfc6154c 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
@@ -198,6 +198,11 @@ namespace MaterialEditor
&group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId),
[this](const auto source, const auto target) { return CompareInstanceNodeProperties(source, target); });
AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget);
+
+ bool isGroupVisible = false;
+ MaterialDocumentRequestBus::EventResult(
+ isGroupVisible, m_documentId, &MaterialDocumentRequestBus::Events::IsPropertyGroupVisible, AZ::Name{groupNameId});
+ SetGroupVisible(groupNameId, isGroupVisible);
}
}
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp
index 59e29d29f1..31d69569db 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp
@@ -305,8 +305,11 @@ namespace AZ
{
AZ::RPI::MaterialPropertyGroupDynamicMetadata& metadata = propertyGroupDynamicMetadata[AZ::Name{groupPair.first}];
- metadata.m_visibility = IsGroupVisible(groupPair.first) ?
- AZ::RPI::MaterialPropertyGroupVisibility::Enabled : AZ::RPI::MaterialPropertyGroupVisibility::Hidden;
+ // It's significant that we check IsGroupHidden rather than IsGroupVisisble, because it follows the same rules as QWidget::isHidden().
+ // We don't care whether the widget and all its parents are visible, we only care about whether the group was hidden within the context
+ // of the material property inspector.
+ metadata.m_visibility = IsGroupHidden(groupPair.first) ?
+ AZ::RPI::MaterialPropertyGroupVisibility::Hidden : AZ::RPI::MaterialPropertyGroupVisibility::Enabled;
}
for (AZ::RPI::Ptr& functor : m_editorFunctors)
From 36a79aca8a353316f560f3079ff2b66cb5120996 Mon Sep 17 00:00:00 2001
From: sphrose <82213493+sphrose@users.noreply.github.com>
Date: Thu, 13 May 2021 10:56:39 +0100
Subject: [PATCH 017/132] Remove redundant function.
---
.../UI/PropertyEditor/PropertyRowWidget.cpp | 7 +------
.../UI/PropertyEditor/PropertyRowWidget.hxx | 1 -
2 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
index 85784d61e0..890253b528 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp
@@ -126,7 +126,7 @@ namespace AzToolsFramework
{
QStylePainter p(this);
- if (IsReorderableRow())
+ if (CanBeReordered())
{
const QPen linePen(QColor(0x3B3E3F));
p.setPen(linePen);
@@ -1332,11 +1332,6 @@ namespace AzToolsFramework
return canBeTopLevel(this);
}
- bool PropertyRowWidget::IsReorderableRow() const
- {
- return CanBeReordered();
- }
-
bool PropertyRowWidget::GetAppendDefaultLabelToName()
{
return false;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
index 1c17cab69f..79121403c9 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx
@@ -83,7 +83,6 @@ namespace AzToolsFramework
PropertyRowWidget* GetParentRow() const { return m_parentRow; }
int GetLevel() const;
bool IsTopLevel() const;
- bool IsReorderableRow() const;
// Remove the default label and append the text to the name label.
bool GetAppendDefaultLabelToName();
From f478340376267f1623f7138fe2b06024d050687c Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Wed, 12 May 2021 16:04:25 -0500
Subject: [PATCH 018/132] Data driven asset importer. Need to fix reflection
---
AssetImporterSettings.json | 7 +++
.../FbxImportRequestHandler.cpp | 60 +++++++++++++++++--
.../FbxSceneBuilder/FbxImportRequestHandler.h | 16 ++++-
3 files changed, 78 insertions(+), 5 deletions(-)
create mode 100644 AssetImporterSettings.json
diff --git a/AssetImporterSettings.json b/AssetImporterSettings.json
new file mode 100644
index 0000000000..134484cf8d
--- /dev/null
+++ b/AssetImporterSettings.json
@@ -0,0 +1,7 @@
+{
+ "SupportedFileTypeExtensions" : [
+ ".fbx",
+ ".stl",
+ ".stp"
+ ]
+}
\ No newline at end of file
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
index 155209f1b5..2210abfaf7 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
@@ -10,7 +10,14 @@
*
*/
+#include
+#include
+#include
+#include
#include
+#include
+#include
+#include
#include
#include
#include
@@ -23,10 +30,47 @@ namespace AZ
{
namespace FbxSceneImporter
{
- const char* FbxImportRequestHandler::s_extension = ".fbx";
+ AssetImporterSettings::AssetImporterSettings()
+ {
+ // Default supported extension in case the settings file isn't found
+ m_supportedFileTypeExtensions.emplace(".fbx");
+ }
+
+ void AssetImporterSettings::Reflect(AZ::ReflectContext* context)
+ {
+ if (auto serializeContext = azrtti_cast(context); serializeContext)
+ {
+ serializeContext->Class()
+ ->Version(1)
+ ->Field("SupportedFileTypeExtensions", &AssetImporterSettings::m_supportedFileTypeExtensions);
+ }
+ }
void FbxImportRequestHandler::Activate()
{
+ // Attempt to load the Slice Builder Settings file
+ AZ::IO::LocalFileIO localFileIO;
+
+ // This will point to @assets@/SettingsFilename, which loads from the cache
+ // We don't really want this but it works for now
+ // Trying to use AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath at this point
+ // would fail because components seem to activate before the AP has populated its file list
+ AZ::IO::Path sliceBuilderSettingsIoPath(SettingsFilename);
+ auto result = AzFramework::FileFunc::ReadJsonFile(sliceBuilderSettingsIoPath, &localFileIO);
+ if (result.IsSuccess())
+ {
+ AZ::JsonSerializationResult::ResultCode serializationResult =
+ AZ::JsonSerialization::Load(m_settings, result.GetValue());
+ if (serializationResult.GetProcessing() == AZ::JsonSerializationResult::Processing::Halted)
+ {
+ AZ_Warning("", false, "Error in Asset Importer Settings file.\nUsing default settings.");
+ }
+ }
+ else
+ {
+ AZ_Warning("", false, "Failed to load Asset Importer Settings file.\nUsing default settings.");
+ }
+
BusConnect();
}
@@ -37,21 +81,29 @@ namespace AZ
void FbxImportRequestHandler::Reflect(ReflectContext* context)
{
+ AssetImporterSettings::Reflect(context);
+
SerializeContext* serializeContext = azrtti_cast(context);
if (serializeContext)
{
- serializeContext->Class()->Version(1);
+ serializeContext->Class()->Version(1)->Attribute(
+ AZ::Edit::Attributes::SystemComponentTags,
+ AZStd::vector({AssetBuilderSDK::ComponentTags::AssetBuilder}));
+
}
}
void FbxImportRequestHandler::GetSupportedFileExtensions(AZStd::unordered_set& extensions)
{
- extensions.insert(s_extension);
+ extensions.insert(m_settings.m_supportedFileTypeExtensions.begin(), m_settings.m_supportedFileTypeExtensions.end());
}
Events::LoadingResult FbxImportRequestHandler::LoadAsset(Containers::Scene& scene, const AZStd::string& path, const Uuid& guid, [[maybe_unused]] RequestingApplication requester)
{
- if (!AzFramework::StringFunc::Path::IsExtension(path.c_str(), s_extension))
+ AZStd::string extension;
+ AzFramework::StringFunc::Path::GetExtension(path.c_str(), extension);
+
+ if (!m_settings.m_supportedFileTypeExtensions.contains(extension))
{
return Events::LoadingResult::Ignored;
}
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
index 8b33051f1e..3ef2823e24 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
@@ -21,6 +21,17 @@ namespace AZ
{
namespace FbxSceneImporter
{
+ struct AssetImporterSettings
+ {
+ AZ_TYPE_INFO(AssetImporterSettings, "{8BB6C7AD-BF99-44DC-9DA1-E7AD3F03DC10}");
+
+ AssetImporterSettings();
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ AZStd::unordered_set m_supportedFileTypeExtensions;
+ };
+
class FbxImportRequestHandler
: public SceneCore::BehaviorComponent
, public Events::AssetImportRequestBus::Handler
@@ -39,7 +50,10 @@ namespace AZ
RequestingApplication requester) override;
private:
- static const char* s_extension;
+
+ AssetImporterSettings m_settings;
+
+ static constexpr const char* SettingsFilename = "AssetImporterSettings.json";
};
} // namespace FbxSceneImporter
} // namespace SceneAPI
From 2b538c9921ce2be2ee4fc9c9877c1dd0272c8f58 Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Thu, 13 May 2021 09:47:21 -0500
Subject: [PATCH 019/132] Switch to using settings registry
# Conflicts:
# Assets/Engine/Registry/assetimporter.setreg
---
AssetImporterSettings.json | 7 ----
.../SceneAPI/FbxSceneBuilder/DllMain.cpp | 6 +---
.../FbxImportRequestHandler.cpp | 35 +++++--------------
.../FbxSceneBuilder/FbxImportRequestHandler.h | 6 ++--
.../SceneBuilder/SceneBuilderComponent.cpp | 6 +++-
.../SceneBuilder/SceneBuilderComponent.h | 2 ++
Registry/assetimporter.setreg | 17 +++++++++
7 files changed, 37 insertions(+), 42 deletions(-)
delete mode 100644 AssetImporterSettings.json
create mode 100644 Registry/assetimporter.setreg
diff --git a/AssetImporterSettings.json b/AssetImporterSettings.json
deleted file mode 100644
index 134484cf8d..0000000000
--- a/AssetImporterSettings.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "SupportedFileTypeExtensions" : [
- ".fbx",
- ".stl",
- ".stp"
- ]
-}
\ No newline at end of file
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
index 3dc14814de..d3d7b38663 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
@@ -46,11 +46,6 @@ namespace AZ
// Currently it's still needed to explicitly create an instance of this instead of letting
// it be a normal component. This is because ResourceCompilerScene needs to return
// the list of available extensions before it can start the application.
- if (!g_fbxImporter)
- {
- g_fbxImporter = aznew AZ::SceneAPI::FbxSceneImporter::FbxImportRequestHandler();
- g_fbxImporter->Activate();
- }
}
void Reflect(AZ::SerializeContext* /*context*/)
@@ -64,6 +59,7 @@ namespace AZ
{
// Global importer and behavior
g_componentDescriptors.push_back(FbxSceneBuilder::FbxImporter::CreateDescriptor());
+ g_componentDescriptors.push_back(FbxSceneImporter::FbxImportRequestHandler::CreateDescriptor());
// Node and attribute importers
g_componentDescriptors.push_back(AssImpBitangentStreamImporter::CreateDescriptor());
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
index 2210abfaf7..d3962cce60 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
@@ -30,12 +30,6 @@ namespace AZ
{
namespace FbxSceneImporter
{
- AssetImporterSettings::AssetImporterSettings()
- {
- // Default supported extension in case the settings file isn't found
- m_supportedFileTypeExtensions.emplace(".fbx");
- }
-
void AssetImporterSettings::Reflect(AZ::ReflectContext* context)
{
if (auto serializeContext = azrtti_cast(context); serializeContext)
@@ -48,27 +42,11 @@ namespace AZ
void FbxImportRequestHandler::Activate()
{
- // Attempt to load the Slice Builder Settings file
- AZ::IO::LocalFileIO localFileIO;
-
- // This will point to @assets@/SettingsFilename, which loads from the cache
- // We don't really want this but it works for now
- // Trying to use AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath at this point
- // would fail because components seem to activate before the AP has populated its file list
- AZ::IO::Path sliceBuilderSettingsIoPath(SettingsFilename);
- auto result = AzFramework::FileFunc::ReadJsonFile(sliceBuilderSettingsIoPath, &localFileIO);
- if (result.IsSuccess())
+ auto settingsRegistry = AZ::SettingsRegistry::Get();
+
+ if (settingsRegistry)
{
- AZ::JsonSerializationResult::ResultCode serializationResult =
- AZ::JsonSerialization::Load(m_settings, result.GetValue());
- if (serializationResult.GetProcessing() == AZ::JsonSerializationResult::Processing::Halted)
- {
- AZ_Warning("", false, "Error in Asset Importer Settings file.\nUsing default settings.");
- }
- }
- else
- {
- AZ_Warning("", false, "Failed to load Asset Importer Settings file.\nUsing default settings.");
+ settingsRegistry->GetObject(m_settings, "/O3DE/SceneAPI/AssetImporter");
}
BusConnect();
@@ -125,6 +103,11 @@ namespace AZ
return Events::LoadingResult::AssetFailure;
}
}
+
+ void FbxImportRequestHandler::GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided)
+ {
+ provided.emplace_back(AZ_CRC_CE("AssetImportRequestHandler"));
+ }
} // namespace Import
} // namespace SceneAPI
} // namespace AZ
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
index 3ef2823e24..99d2061229 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
@@ -24,9 +24,7 @@ namespace AZ
struct AssetImporterSettings
{
AZ_TYPE_INFO(AssetImporterSettings, "{8BB6C7AD-BF99-44DC-9DA1-E7AD3F03DC10}");
-
- AssetImporterSettings();
-
+
static void Reflect(AZ::ReflectContext* context);
AZStd::unordered_set m_supportedFileTypeExtensions;
@@ -49,6 +47,8 @@ namespace AZ
Events::LoadingResult LoadAsset(Containers::Scene& scene, const AZStd::string& path, const Uuid& guid,
RequestingApplication requester) override;
+ static void GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided);
+
private:
AssetImporterSettings m_settings;
diff --git a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp
index e71a5207d0..25faca3667 100644
--- a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp
+++ b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp
@@ -72,6 +72,11 @@ namespace SceneBuilder
m_sceneBuilder.BusDisconnect();
}
+ void BuilderPluginComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
+ {
+ required.emplace_back(AZ_CRC_CE("AssetImportRequestHandler"));
+ }
+
void BuilderPluginComponent::Reflect(AZ::ReflectContext* context)
{
AZ::SerializeContext* serializeContext = azrtti_cast(context);
@@ -81,5 +86,4 @@ namespace SceneBuilder
->Attribute(AZ::Edit::Attributes::SystemComponentTags, AZStd::vector({ AssetBuilderSDK::ComponentTags::AssetBuilder }));
}
}
-
} // namespace SceneBuilder
diff --git a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.h b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.h
index c1fc6ebb36..aed5e1b026 100644
--- a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.h
+++ b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.h
@@ -32,6 +32,8 @@ namespace SceneBuilder
void Activate() override;
void Deactivate() override;
+ static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
+
private:
SceneBuilderWorker m_sceneBuilder;
};
diff --git a/Registry/assetimporter.setreg b/Registry/assetimporter.setreg
new file mode 100644
index 0000000000..e0b0f00f6c
--- /dev/null
+++ b/Registry/assetimporter.setreg
@@ -0,0 +1,17 @@
+{
+ "O3DE":
+ {
+ "SceneAPI":
+ {
+ "AssetImporter":
+ {
+ "SupportedFileTypeExtensions":
+ [
+ ".fbx",
+ ".stl",
+ ".stp"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
From 70c8ef99ef4a9b3bc2d7c69a1262304522085177 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Thu, 13 May 2021 09:39:01 -0700
Subject: [PATCH 020/132] Updates in response to code review, from gadams3.
Cleaned up code around MaterialFunctor's QueryMaterialPropertyMetadata and
QueryMaterialPropertyGroupMetadata. Removed unnecessary
"groupHeader->setObjectName(...)" Simplified code in
MaterialInspector::OnDocumentPropertyGroupVisibilityChanged.
---
.../RPI.Reflect/Material/MaterialFunctor.h | 4 +-
.../RPI.Reflect/Material/MaterialFunctor.cpp | 83 +++++++++----------
.../Code/Source/Inspector/InspectorWidget.cpp | 1 -
.../MaterialInspector/MaterialInspector.cpp | 7 +-
4 files changed, 42 insertions(+), 53 deletions(-)
diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h
index 6b9b34aa1b..83472ade77 100644
--- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h
+++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h
@@ -198,8 +198,8 @@ namespace AZ
);
private:
- AZStd::list_iterator> QueryMaterialPropertyMetadata(const Name& propertyName) const;
- AZStd::list_iterator> QueryMaterialPropertyGroupMetadata(const Name& propertyGroupName) const;
+ MaterialPropertyDynamicMetadata* QueryMaterialPropertyMetadata(const Name& propertyName) const;
+ MaterialPropertyGroupDynamicMetadata* QueryMaterialPropertyGroupMetadata(const Name& propertyGroupName) const;
const AZStd::vector& m_materialPropertyValues;
RHI::ConstPtr m_materialPropertiesLayout;
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
index ab18a1fb66..17e55309fb 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
@@ -159,12 +159,7 @@ namespace AZ
const MaterialPropertyDynamicMetadata* MaterialFunctor::EditorContext::GetMaterialPropertyMetadata(const Name& propertyName) const
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
- {
- return nullptr;
- }
- return &(it->second);
+ return QueryMaterialPropertyMetadata(propertyName);
}
const MaterialPropertyDynamicMetadata* MaterialFunctor::EditorContext::GetMaterialPropertyMetadata(const MaterialPropertyIndex& index) const
@@ -175,23 +170,20 @@ namespace AZ
const MaterialPropertyGroupDynamicMetadata* MaterialFunctor::EditorContext::GetMaterialPropertyGroupMetadata(const Name& propertyName) const
{
- auto it = QueryMaterialPropertyGroupMetadata(propertyName);
- if (it == m_propertyGroupMetadata.end())
- {
- return nullptr;
- }
- return &(it->second);
+ return QueryMaterialPropertyGroupMetadata(propertyName);
}
bool MaterialFunctor::EditorContext::SetMaterialPropertyGroupVisibility(const Name& propertyGroupName, MaterialPropertyGroupVisibility visibility)
{
- auto it = QueryMaterialPropertyGroupMetadata(propertyGroupName);
- if (it == m_propertyGroupMetadata.end())
+ MaterialPropertyGroupDynamicMetadata* metadata = QueryMaterialPropertyGroupMetadata(propertyGroupName);
+ if (!metadata)
{
return false;
}
- MaterialPropertyGroupVisibility originValue = it->second.m_visibility;
- it->second.m_visibility = visibility;
+
+ MaterialPropertyGroupVisibility originValue = metadata->m_visibility;
+ metadata->m_visibility = visibility;
+
if (originValue != visibility)
{
m_updatedPropertyGroupsOut.insert(propertyGroupName);
@@ -202,13 +194,15 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyVisibility(const Name& propertyName, MaterialPropertyVisibility visibility)
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
+ MaterialPropertyDynamicMetadata* metadata = QueryMaterialPropertyMetadata(propertyName);
+ if (!metadata)
{
return false;
}
- MaterialPropertyVisibility originValue = it->second.m_visibility;
- it->second.m_visibility = visibility;
+
+ MaterialPropertyVisibility originValue = metadata->m_visibility;
+ metadata->m_visibility = visibility;
+
if (originValue != visibility)
{
m_updatedPropertiesOut.insert(propertyName);
@@ -225,14 +219,15 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyDescription(const Name& propertyName, AZStd::string description)
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
+ MaterialPropertyDynamicMetadata* metadata = QueryMaterialPropertyMetadata(propertyName);
+ if (!metadata)
{
return false;
}
- AZStd::string origin = it->second.m_description;
- it->second.m_description = description;
+ AZStd::string origin = metadata->m_description;
+ metadata->m_description = description;
+
if (origin != description)
{
m_updatedPropertiesOut.insert(propertyName);
@@ -249,14 +244,14 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyMinValue(const Name& propertyName, const MaterialPropertyValue& min)
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
+ MaterialPropertyDynamicMetadata* metadata = QueryMaterialPropertyMetadata(propertyName);
+ if (!metadata)
{
return false;
}
- MaterialPropertyValue origin = it->second.m_propertyRange.m_min;
- it->second.m_propertyRange.m_min = min;
+ MaterialPropertyValue origin = metadata->m_propertyRange.m_min;
+ metadata->m_propertyRange.m_min = min;
if(origin != min)
{
@@ -274,14 +269,14 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertyMaxValue(const Name& propertyName, const MaterialPropertyValue& max)
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
+ MaterialPropertyDynamicMetadata* metadata = QueryMaterialPropertyMetadata(propertyName);
+ if (!metadata)
{
return false;
}
- MaterialPropertyValue origin = it->second.m_propertyRange.m_max;
- it->second.m_propertyRange.m_max = max;
+ MaterialPropertyValue origin = metadata->m_propertyRange.m_max;
+ metadata->m_propertyRange.m_max = max;
if (origin != max)
{
@@ -299,14 +294,14 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertySoftMinValue(const Name& propertyName, const MaterialPropertyValue& min)
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
+ MaterialPropertyDynamicMetadata* metadata = QueryMaterialPropertyMetadata(propertyName);
+ if (!metadata)
{
return false;
}
- MaterialPropertyValue origin = it->second.m_propertyRange.m_softMin;
- it->second.m_propertyRange.m_softMin = min;
+ MaterialPropertyValue origin = metadata->m_propertyRange.m_softMin;
+ metadata->m_propertyRange.m_softMin = min;
if (origin != min)
{
@@ -324,14 +319,14 @@ namespace AZ
bool MaterialFunctor::EditorContext::SetMaterialPropertySoftMaxValue(const Name& propertyName, const MaterialPropertyValue& max)
{
- auto it = QueryMaterialPropertyMetadata(propertyName);
- if (it == m_propertyMetadata.end())
+ MaterialPropertyDynamicMetadata* metadata = QueryMaterialPropertyMetadata(propertyName);
+ if (!metadata)
{
return false;
}
- MaterialPropertyValue origin = it->second.m_propertyRange.m_softMax;
- it->second.m_propertyRange.m_softMax = max;
+ MaterialPropertyValue origin = metadata->m_propertyRange.m_softMax;
+ metadata->m_propertyRange.m_softMax = max;
if (origin != max)
{
@@ -347,7 +342,7 @@ namespace AZ
return SetMaterialPropertySoftMaxValue(name, max);
}
- AZStd::list_iterator> MaterialFunctor::EditorContext::QueryMaterialPropertyMetadata(const Name& propertyName) const
+ MaterialPropertyDynamicMetadata* MaterialFunctor::EditorContext::QueryMaterialPropertyMetadata(const Name& propertyName) const
{
auto it = m_propertyMetadata.find(propertyName);
if (it == m_propertyMetadata.end())
@@ -355,10 +350,10 @@ namespace AZ
AZ_Error("MaterialFunctor", false, "Couldn't find metadata for material property: %s.", propertyName.GetCStr());
}
- return it;
+ return &it->second;
}
- AZStd::list_iterator> MaterialFunctor::EditorContext::QueryMaterialPropertyGroupMetadata(const Name& propertyGroupName) const
+ MaterialPropertyGroupDynamicMetadata* MaterialFunctor::EditorContext::QueryMaterialPropertyGroupMetadata(const Name& propertyGroupName) const
{
auto it = m_propertyGroupMetadata.find(propertyGroupName);
if (it == m_propertyGroupMetadata.end())
@@ -366,7 +361,7 @@ namespace AZ
AZ_Error("MaterialFunctor", false, "Couldn't find metadata for material property group: %s.", propertyGroupName.GetCStr());
}
- return it;
+ return &it->second;
}
template
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
index 83aed3c2ae..097a819e49 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp
@@ -68,7 +68,6 @@ namespace AtomToolsFramework
InspectorGroupHeaderWidget* groupHeader = new InspectorGroupHeaderWidget(m_ui->m_propertyContent);
groupHeader->setText(groupDisplayName.c_str());
groupHeader->setToolTip(groupDescription.c_str());
- groupHeader->setObjectName(groupNameId.c_str());
m_layout->addWidget(groupHeader);
groupWidget->setObjectName(groupNameId.c_str());
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
index 19dfc6154c..706d365027 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp
@@ -253,12 +253,7 @@ namespace MaterialEditor
void MaterialInspector::OnDocumentPropertyGroupVisibilityChanged(const AZ::Uuid&, const AZ::Name& groupId, bool visible)
{
- auto groupIter = m_groups.find(groupId.GetStringView());
-
- if(groupIter != m_groups.end())
- {
- SetGroupVisible(groupIter->first, visible);
- }
+ SetGroupVisible(groupId.GetStringView(), visible);
}
void MaterialInspector::BeforePropertyModified(AzToolsFramework::InstanceDataNode* pNode)
From 1684c338b23b8ae7f9aff43748533b79de2b7541 Mon Sep 17 00:00:00 2001
From: Chris Santora
Date: Thu, 13 May 2021 15:16:37 -0700
Subject: [PATCH 021/132] More minor cleanup in MaterialFunctor.cpp
---
.../RPI.Reflect/Material/MaterialFunctor.cpp | 42 +++++++------------
1 file changed, 14 insertions(+), 28 deletions(-)
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
index 17e55309fb..a41ab9eea6 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp
@@ -181,11 +181,9 @@ namespace AZ
return false;
}
- MaterialPropertyGroupVisibility originValue = metadata->m_visibility;
- metadata->m_visibility = visibility;
-
- if (originValue != visibility)
+ if (metadata->m_visibility != visibility)
{
+ metadata->m_visibility = visibility;
m_updatedPropertyGroupsOut.insert(propertyGroupName);
}
@@ -200,11 +198,9 @@ namespace AZ
return false;
}
- MaterialPropertyVisibility originValue = metadata->m_visibility;
- metadata->m_visibility = visibility;
-
- if (originValue != visibility)
+ if (metadata->m_visibility != visibility)
{
+ metadata->m_visibility = visibility;
m_updatedPropertiesOut.insert(propertyName);
}
@@ -225,11 +221,9 @@ namespace AZ
return false;
}
- AZStd::string origin = metadata->m_description;
- metadata->m_description = description;
-
- if (origin != description)
+ if (metadata->m_description != description)
{
+ metadata->m_description = description;
m_updatedPropertiesOut.insert(propertyName);
}
@@ -250,11 +244,9 @@ namespace AZ
return false;
}
- MaterialPropertyValue origin = metadata->m_propertyRange.m_min;
- metadata->m_propertyRange.m_min = min;
-
- if(origin != min)
+ if(metadata->m_propertyRange.m_min != min)
{
+ metadata->m_propertyRange.m_min = min;
m_updatedPropertiesOut.insert(propertyName);
}
@@ -275,11 +267,9 @@ namespace AZ
return false;
}
- MaterialPropertyValue origin = metadata->m_propertyRange.m_max;
- metadata->m_propertyRange.m_max = max;
-
- if (origin != max)
+ if (metadata->m_propertyRange.m_max != max)
{
+ metadata->m_propertyRange.m_max = max;
m_updatedPropertiesOut.insert(propertyName);
}
@@ -300,11 +290,9 @@ namespace AZ
return false;
}
- MaterialPropertyValue origin = metadata->m_propertyRange.m_softMin;
- metadata->m_propertyRange.m_softMin = min;
-
- if (origin != min)
+ if (metadata->m_propertyRange.m_softMin != min)
{
+ metadata->m_propertyRange.m_softMin = min;
m_updatedPropertiesOut.insert(propertyName);
}
@@ -325,11 +313,9 @@ namespace AZ
return false;
}
- MaterialPropertyValue origin = metadata->m_propertyRange.m_softMax;
- metadata->m_propertyRange.m_softMax = max;
-
- if (origin != max)
+ if (metadata->m_propertyRange.m_softMax != max)
{
+ metadata->m_propertyRange.m_softMax = max;
m_updatedPropertiesOut.insert(propertyName);
}
From 81067e38c9e6b6f489457baa0b5108f02ae7b397 Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Thu, 13 May 2021 17:39:27 -0500
Subject: [PATCH 022/132] Remove stp
---
Registry/assetimporter.setreg | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Registry/assetimporter.setreg b/Registry/assetimporter.setreg
index e0b0f00f6c..bd7c4d0705 100644
--- a/Registry/assetimporter.setreg
+++ b/Registry/assetimporter.setreg
@@ -8,8 +8,7 @@
"SupportedFileTypeExtensions":
[
".fbx",
- ".stl",
- ".stp"
+ ".stl"
]
}
}
From b7891f4fb6e3fa5a596d5acd436fc9de12446588 Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Thu, 13 May 2021 18:43:51 -0500
Subject: [PATCH 023/132] Code cleanup
---
Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp | 7 -------
.../FbxSceneBuilder/FbxImportRequestHandler.cpp | 11 ++++-------
2 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
index d3d7b38663..5ffe916d23 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
@@ -41,13 +41,6 @@ namespace AZ
static AZ::SceneAPI::FbxSceneImporter::FbxImportRequestHandler* g_fbxImporter = nullptr;
static AZStd::vector g_componentDescriptors;
- void Initialize()
- {
- // Currently it's still needed to explicitly create an instance of this instead of letting
- // it be a normal component. This is because ResourceCompilerScene needs to return
- // the list of available extensions before it can start the application.
- }
-
void Reflect(AZ::SerializeContext* /*context*/)
{
// Descriptor registration is done in Reflect instead of Initialize because the ResourceCompilerScene initializes the libraries before
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
index d3962cce60..65bb8de4c7 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
@@ -10,19 +10,16 @@
*
*/
-#include
#include
-#include
#include
#include
#include
-#include
-#include
-#include
+#include
+#include
+#include
#include
#include
#include
-#include
namespace AZ
{
@@ -79,7 +76,7 @@ namespace AZ
Events::LoadingResult FbxImportRequestHandler::LoadAsset(Containers::Scene& scene, const AZStd::string& path, const Uuid& guid, [[maybe_unused]] RequestingApplication requester)
{
AZStd::string extension;
- AzFramework::StringFunc::Path::GetExtension(path.c_str(), extension);
+ StringFunc::Path::GetExtension(path.c_str(), extension);
if (!m_settings.m_supportedFileTypeExtensions.contains(extension))
{
From ba4439c397ef8b2b3203b482f5a0fd56ebf88713 Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Thu, 13 May 2021 19:52:00 -0500
Subject: [PATCH 024/132] Remove call to deleted init function
---
Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
index 5ffe916d23..d2818f3653 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
@@ -114,7 +114,6 @@ namespace AZ
extern "C" AZ_DLL_EXPORT void InitializeDynamicModule(void* env)
{
AZ::Environment::Attach(static_cast(env));
- AZ::SceneAPI::FbxSceneBuilder::Initialize();
}
extern "C" AZ_DLL_EXPORT void Reflect(AZ::SerializeContext* context)
{
From 70c968f82917b83528deed7cec2b316be2e5fc03 Mon Sep 17 00:00:00 2001
From: daimini
Date: Fri, 14 May 2021 15:02:39 -0700
Subject: [PATCH 025/132] Fixes issue with relative positioning of children on
Prefab creation. Makes CreateLink more generic to facilitate reuse.
---
.../Prefab/PrefabPublicHandler.cpp | 83 ++++++++++---------
.../Prefab/PrefabPublicHandler.h | 7 +-
2 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
index 5ecff637a1..4eb6580158 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
@@ -121,6 +121,41 @@ namespace AzToolsFramework
}
AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId();
+ AZ::Entity* containerEntity = GetEntityById(containerEntityId);
+
+ {
+ // Generate the transform for the container entity out of the top level entities, and set it
+ // This step needs to be done before anything is parented to the container, else children position will be wrong
+ Prefab::PrefabDom containerEntityDomBefore;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
+
+ AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero());
+ AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero());
+
+ // Set container entity to be child of common root
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId);
+
+ // Set the transform (translation, rotation) of the container entity
+ GenerateContainerEntityTransform(topLevelEntities, containerEntityTranslation, containerEntityRotation);
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation);
+ AZ::TransformBus::Event(
+ containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation);
+
+ PrefabDom containerEntityDomAfter;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
+
+ PrefabDom patch;
+ m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
+ m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
+
+ // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
+ m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
+
+ // Create a link between the templates of the newly created instance and the instance it's being parented under.
+ CreateLink(
+ instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(),
+ undoBatch.GetUndoBatch(), patch);
+ }
// Parent the entities to the container entity. Parenting the container entities of the instances passed to createPrefab
// will be done during the creation of links below.
@@ -144,16 +179,10 @@ namespace AzToolsFramework
// These link creations shouldn't be undone because that would put the template in a non-usable state if a user
// chooses to instantiate the template after undoing the creation.
- CreateLink(
- {&nestedInstanceContainerEntity->get()}, *nestedInstance, instanceToCreate->get().GetTemplateId(),
- undoBatch.GetUndoBatch(), containerEntityId, false);
+ PrefabDom emptyPatch;
+ CreateLink(*nestedInstance, instanceToCreate->get().GetTemplateId(), undoBatch.GetUndoBatch(), emptyPatch, false);
});
- // Create a link between the templates of the newly created instance and the instance it's being parented under.
- CreateLink(
- topLevelEntities, instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(),
- undoBatch.GetUndoBatch(), commonRootEntityId);
-
for (AZ::Entity* topLevelEntity : topLevelEntities)
{
AZ::EntityId topLevelEntityId = topLevelEntity->GetId();
@@ -227,8 +256,7 @@ namespace AzToolsFramework
ScopedUndoBatch undoBatch("Instantiate Prefab");
PrefabDom instanceToParentUnderDomBeforeCreate;
- m_instanceToTemplateInterface->GenerateDomForInstance(
- instanceToParentUnderDomBeforeCreate, instanceToParentUnder->get());
+ m_instanceToTemplateInterface->GenerateDomForInstance(instanceToParentUnderDomBeforeCreate, instanceToParentUnder->get());
// Instantiate the Prefab
auto instanceToCreate = prefabEditorEntityOwnershipInterface->InstantiatePrefab(relativePath, instanceToParentUnder);
@@ -242,8 +270,8 @@ namespace AzToolsFramework
PrefabUndoHelpers::UpdatePrefabInstance(
instanceToParentUnder->get(), "Update prefab instance", instanceToParentUnderDomBeforeCreate, undoBatch.GetUndoBatch());
- CreateLink({}, instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(),
- undoBatch.GetUndoBatch(), parent);
+ PrefabDom emptyPatch;
+ CreateLink(instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(), undoBatch.GetUndoBatch(), emptyPatch);
AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId();
// Apply position
@@ -314,33 +342,9 @@ namespace AzToolsFramework
}
void PrefabPublicHandler::CreateLink(
- const EntityList& topLevelEntities, Instance& sourceInstance, TemplateId targetTemplateId,
- UndoSystem::URSequencePoint* undoBatch, AZ::EntityId commonRootEntityId, const bool isUndoRedoSupportNeeded)
+ Instance& sourceInstance, TemplateId targetTemplateId,
+ UndoSystem::URSequencePoint* undoBatch, PrefabDom& patch, const bool isUndoRedoSupportNeeded)
{
- AZ::EntityId containerEntityId = sourceInstance.GetContainerEntityId();
- AZ::Entity* containerEntity = GetEntityById(containerEntityId);
- Prefab::PrefabDom containerEntityDomBefore;
- m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
-
- AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero());
- AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero());
-
- // Set the transform (translation, rotation) of the container entity
- GenerateContainerEntityTransform(topLevelEntities, containerEntityTranslation, containerEntityRotation);
-
- // Set container entity to be child of common root
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId);
-
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation);
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation);
-
- PrefabDom containerEntityDomAfter;
- m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
-
- PrefabDom patch;
- m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
- m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
-
LinkId linkId;
if (isUndoRedoSupportNeeded)
{
@@ -356,9 +360,6 @@ namespace AzToolsFramework
}
sourceInstance.SetLinkId(linkId);
-
- // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
- m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
}
void PrefabPublicHandler::RemoveLink(
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
index 138bc84aa0..95f9cb8174 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
@@ -72,16 +72,15 @@ namespace AzToolsFramework
/**
* Creates a link between the templates of an instance and its parent.
*
- * \param topLevelEntities The list of entities that are immediate children to the container entity of the instance.
* \param sourceInstance The instance that corresponds to the source template of the link.
* \param targetInstance The id of the target template.
* \param undoBatch The undo batch to set as parent for this create link action.
- * \param commonRootEntityId The id of the entity that the source instance should be parented under.
+ * \param patch The patch to store in the newly created link dom.
* \param isUndoRedoSupportNeeded The flag indicating whether the link should be created with undo/redo support or not.
*/
void CreateLink(
- const EntityList& topLevelEntities, Instance& sourceInstance, TemplateId targetTemplateId,
- UndoSystem::URSequencePoint* undoBatch, AZ::EntityId commonRootEntityId, const bool isUndoRedoSupportNeeded = true);
+ Instance& sourceInstance, TemplateId targetTemplateId, UndoSystem::URSequencePoint* undoBatch,
+ PrefabDom& patch, const bool isUndoRedoSupportNeeded = true);
/**
* Removes the link between template of the sourceInstance and the template corresponding to targetTemplateId.
From 12760ef6a302309ce8e658e724bb51a697f0a041 Mon Sep 17 00:00:00 2001
From: daimini
Date: Fri, 14 May 2021 16:37:47 -0700
Subject: [PATCH 026/132] Remove unused container entity retrieval
---
.../AzToolsFramework/Prefab/PrefabPublicHandler.cpp | 5 -----
1 file changed, 5 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
index 4eb6580158..5323fd3d7f 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
@@ -172,11 +172,6 @@ namespace AzToolsFramework
}
instanceToCreate->get().GetNestedInstances([&](AZStd::unique_ptr& nestedInstance) {
- AZ_Assert(nestedInstance, "Invalid nested instance found in the new prefab created.");
- EntityOptionalReference nestedInstanceContainerEntity = nestedInstance->GetContainerEntity();
- AZ_Assert(
- nestedInstanceContainerEntity, "Invalid container entity found for the nested instance used in prefab creation.");
-
// These link creations shouldn't be undone because that would put the template in a non-usable state if a user
// chooses to instantiate the template after undoing the creation.
PrefabDom emptyPatch;
From d12cf2b6e136ce7f21801df3f4165477a393fa2d Mon Sep 17 00:00:00 2001
From: balibhan
Date: Mon, 17 May 2021 10:21:56 +0530
Subject: [PATCH 027/132] Pane properties test script
---
...Pane_PropertiesChanged_RetainsOnRestart.py | 161 ++++++++++++++++++
.../PythonTests/scripting/TestSuite_Active.py | 41 ++++-
2 files changed, 195 insertions(+), 7 deletions(-)
create mode 100644 AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py
new file mode 100644
index 0000000000..3750fd290b
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py
@@ -0,0 +1,161 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+class Tests:
+ test_panes_visible = "All the test panes are opened"
+ close_pane_1 = "Test pane 1 is closed"
+ resize_pane_3 = "Test pane 3 resized successfully"
+ location_changed = "Location of test pane 2 changed successfully"
+ visiblity_retained = "Test pane retained its visiblity on Editor restart"
+ location_retained = "Test pane retained its location on Editor restart"
+ size_retained = "Test pane retained its size on Editor restart"
+
+
+def Pane_PropertiesChanged_RetainsOnRestart():
+ """
+ Summary:
+ The Script Canvas window is opened to verify if Script canvas panes can retain its visibility, size and location
+ upon Editor restart.
+
+ Expected Behavior:
+ The ScriptCanvas pane retain it's visiblity, size and location upon Editor restart.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Make sure test panes are open and visible
+ 3) Close test pane 1
+ 4) Change dock location of test pane 2
+ 5) Resize test pane 3
+ 6) Restart Editor
+ 7) Verify if test pane 1 retain its visiblity
+ 8) Verify if location of test pane 2 is retained
+ 9) Verify if size of test pane 3 is retained
+ 10) Restore default layout and close SC window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ import sys
+
+ # Helper imports
+ from utils import Report
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Lumberyard Imports
+ import azlmbr.legacy.general as general
+
+ # Pyside imports
+ from PySide2 import QtCore, QtWidgets
+ from PySide2.QtCore import Qt
+
+ # Constants
+ TEST_CONDITION = sys.argv[1]
+ TEST_PANE_1 = "NodePalette" # pane used to test visibility
+ TEST_PANE_2 = "VariableManager" # pane used to test location
+ TEST_PANE_3 = "NodeInspector" # pane used to test size
+ SCALE_INT = 10 # Random resize scale integer
+ DOCKAREA = Qt.TopDockWidgetArea # Preferred top area since no widget is docked on top
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ if TEST_CONDITION == "before_restart":
+ # 2) Make sure test panes are open and visible
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ test_pane_1 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_1)
+ test_pane_2 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_2)
+ test_pane_3 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_3)
+
+ result = test_pane_1.isVisible() and test_pane_2.isVisible() and test_pane_3.isVisible()
+ Report.info(f"{Tests.test_panes_visible}: {result}")
+
+ # 3) Close test pane
+ test_pane_1.close()
+ Report.info(f"{Tests.close_pane_1}: {not test_pane_1.isVisible()}")
+
+ # 4) Change dock location of test pane 2
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ sc_main.addDockWidget(DOCKAREA, find_pane(sc_main, TEST_PANE_2), QtCore.Qt.Vertical)
+ Report.info(f"{Tests.location_changed}: {sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA}")
+
+ # 5) Resize test pane 3
+ initial_size = test_pane_3.frameSize()
+ test_pane_3.resize(initial_size.width() + SCALE_INT, initial_size.height() + SCALE_INT)
+ new_size = test_pane_3.frameSize()
+ resize_success = (
+ abs(initial_size.width() - new_size.width()) == abs(initial_size.height() - new_size.height()) == SCALE_INT
+ )
+ Report.info(f"{Tests.resize_pane_3}: {resize_success}")
+
+ if TEST_CONDITION == "after_restart":
+ try:
+ # 6) Restart Editor
+ # Restart is not possible through script and hence it is done by running the same file as 2 tests with a
+ # condition as before_test and after_test
+
+ # 7) Verify if test pane 1 retain its visiblity
+ # This pane closed before restart and expected that pane should not be visible.
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ Report.info(f"{Tests.visiblity_retained}: {not find_pane(sc, TEST_PANE_1).isVisible()}")
+
+ # 8) Verify if location of test pane 2 is retained
+ # This pane was set at DOCKAREA lcoation before restart
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ Report.info(
+ f"{Tests.location_retained}: {sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA}"
+ )
+
+ # 9) Verify if size of test pane 3 is retained
+ # Verifying if size retained by checking current size not matching with default size
+ test_pane_3 = find_pane(sc, TEST_PANE_3)
+ retained_size = test_pane_3.frameSize()
+ click_menu_option(sc, "Restore Default Layout")
+ actual_size = test_pane_3.frameSize()
+ Report.info(f"{Tests.size_retained}: {retained_size != actual_size}")
+
+ finally:
+ # 10) Restore default layout and close SC window
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+
+ from utils import Report
+
+ Report.start_test(Pane_PropertiesChanged_RetainsOnRestart)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
index c42c9f1a03..9180c1b44c 100755
--- a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
+++ b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
@@ -76,14 +76,8 @@ class TestAutomation(TestAutomationBase):
from . import ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage as test_module
self._run_test(request, workspace, editor, test_module)
-<<<<<<< HEAD
def test_NodePalette_HappyPath_ClearSelection(self, request, workspace, editor, launcher_platform, project):
from . import NodePalette_HappyPath_ClearSelection as test_module
-=======
- @pytest.mark.test_case_id("T92562993")
- def test_NodePalette_ClearSelection(self, request, workspace, editor, launcher_platform, project):
- from . import NodePalette_ClearSelection as test_module
->>>>>>> main
self._run_test(request, workspace, editor, test_module)
@pytest.mark.parametrize("level", ["tmp_level"])
@@ -119,7 +113,6 @@ class TestAutomation(TestAutomationBase):
from . import Debugger_HappyPath_TargetMultipleGraphs as test_module
self._run_test(request, workspace, editor, test_module)
- @pytest.mark.test_case_id("T92569137")
def test_Debugging_TargetMultipleGraphs(self, request, workspace, editor, launcher_platform, project):
from . import Debugging_TargetMultipleGraphs as test_module
self._run_test(request, workspace, editor, test_module)
@@ -262,3 +255,37 @@ class TestScriptCanvasTests(object):
auto_test_mode=False,
timeout=60,
)
+
+ @pytest.mark.parametrize(
+ "config",
+ [
+ {
+ "cfg_args": "before_restart",
+ "expected_lines": [
+ "All the test panes are opened: True",
+ "Test pane 1 is closed: True",
+ "Location of test pane 2 changed successfully: True",
+ "Test pane 3 resized successfully: True",
+ ],
+ },
+ {
+ "cfg_args": "after_restart",
+ "expected_lines": [
+ "Test pane retained its visiblity on Editor restart: True",
+ "Test pane retained its location on Editor restart: True",
+ "Test pane retained its size on Editor restart: True",
+ ],
+ },
+ ],
+ )
+ def test_Pane_PropertiesChanged_RetainsOnRestart(self, request, editor, config, project, launcher_platform):
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "Pane_PropertiesChanged_RetainsOnRestart.py",
+ config.get('expected_lines'),
+ cfg_args=[config.get('cfg_args')],
+ auto_test_mode=False,
+ timeout=60,
+ )
From 3e0ce61d0003a9ad618607364d6403be80afb507 Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Mon, 17 May 2021 08:24:02 -0500
Subject: [PATCH 028/132] Rename setreg file to sceneassetimporter
---
Registry/{assetimporter.setreg => sceneassetimporter.setreg} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename Registry/{assetimporter.setreg => sceneassetimporter.setreg} (100%)
diff --git a/Registry/assetimporter.setreg b/Registry/sceneassetimporter.setreg
similarity index 100%
rename from Registry/assetimporter.setreg
rename to Registry/sceneassetimporter.setreg
From ee4e9af46521fe06a08f910b0086790042fff8af Mon Sep 17 00:00:00 2001
From: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
Date: Mon, 17 May 2021 08:27:04 -0500
Subject: [PATCH 029/132] Rename AssetImporterSettings to SceneImporterSettings
---
.../SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp | 8 ++++----
.../SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h | 6 +++---
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
index 65bb8de4c7..52ab184f66 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
@@ -27,13 +27,13 @@ namespace AZ
{
namespace FbxSceneImporter
{
- void AssetImporterSettings::Reflect(AZ::ReflectContext* context)
+ void SceneImporterSettings::Reflect(AZ::ReflectContext* context)
{
if (auto serializeContext = azrtti_cast(context); serializeContext)
{
- serializeContext->Class()
+ serializeContext->Class()
->Version(1)
- ->Field("SupportedFileTypeExtensions", &AssetImporterSettings::m_supportedFileTypeExtensions);
+ ->Field("SupportedFileTypeExtensions", &SceneImporterSettings::m_supportedFileTypeExtensions);
}
}
@@ -56,7 +56,7 @@ namespace AZ
void FbxImportRequestHandler::Reflect(ReflectContext* context)
{
- AssetImporterSettings::Reflect(context);
+ SceneImporterSettings::Reflect(context);
SerializeContext* serializeContext = azrtti_cast(context);
if (serializeContext)
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
index 99d2061229..f68b56314b 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
@@ -21,9 +21,9 @@ namespace AZ
{
namespace FbxSceneImporter
{
- struct AssetImporterSettings
+ struct SceneImporterSettings
{
- AZ_TYPE_INFO(AssetImporterSettings, "{8BB6C7AD-BF99-44DC-9DA1-E7AD3F03DC10}");
+ AZ_TYPE_INFO(SceneImporterSettings, "{8BB6C7AD-BF99-44DC-9DA1-E7AD3F03DC10}");
static void Reflect(AZ::ReflectContext* context);
@@ -51,7 +51,7 @@ namespace AZ
private:
- AssetImporterSettings m_settings;
+ SceneImporterSettings m_settings;
static constexpr const char* SettingsFilename = "AssetImporterSettings.json";
};
From bcaf4209d59a5aa054c0fb2d5030b09d57655ee9 Mon Sep 17 00:00:00 2001
From: daimini
Date: Mon, 17 May 2021 15:39:25 -0700
Subject: [PATCH 030/132] Move some logic to a helper function. Revert order of
link creation operations as they are not necessary to fix the bug, so it is
preferred to leave them untouched.
---
.../Prefab/PrefabPublicHandler.cpp | 84 ++++++++++---------
.../Prefab/PrefabPublicHandler.h | 5 +-
2 files changed, 49 insertions(+), 40 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
index 47642e90f3..53bf515860 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
@@ -121,41 +121,9 @@ namespace AzToolsFramework
}
AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId();
- AZ::Entity* containerEntity = GetEntityById(containerEntityId);
- {
- // Generate the transform for the container entity out of the top level entities, and set it
- // This step needs to be done before anything is parented to the container, else children position will be wrong
- Prefab::PrefabDom containerEntityDomBefore;
- m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
-
- AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero());
- AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero());
-
- // Set container entity to be child of common root
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId);
-
- // Set the transform (translation, rotation) of the container entity
- GenerateContainerEntityTransform(topLevelEntities, containerEntityTranslation, containerEntityRotation);
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation);
- AZ::TransformBus::Event(
- containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation);
-
- PrefabDom containerEntityDomAfter;
- m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
-
- PrefabDom patch;
- m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
- m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
-
- // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
- m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
-
- // Create a link between the templates of the newly created instance and the instance it's being parented under.
- CreateLink(
- instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(),
- undoBatch.GetUndoBatch(), patch);
- }
+ // Apply the correct transform to the container for the new instance, and store the patch for use when creating the link.
+ PrefabDom patch = ApplyContainerTransformAndGeneratePatch(containerEntityId, commonRootEntityId, topLevelEntities);
// Parent the entities to the container entity. Parenting the container entities of the instances passed to createPrefab
// will be done during the creation of links below.
@@ -172,12 +140,18 @@ namespace AzToolsFramework
}
instanceToCreate->get().GetNestedInstances([&](AZStd::unique_ptr& nestedInstance) {
+ AZ_Assert(nestedInstance, "Invalid nested instance found in the new prefab created.");
+
// These link creations shouldn't be undone because that would put the template in a non-usable state if a user
// chooses to instantiate the template after undoing the creation.
- PrefabDom emptyPatch;
- CreateLink(*nestedInstance, instanceToCreate->get().GetTemplateId(), undoBatch.GetUndoBatch(), emptyPatch, false);
+ CreateLink(*nestedInstance, instanceToCreate->get().GetTemplateId(), undoBatch.GetUndoBatch(), {}, false);
});
+ // Create a link between the templates of the newly created instance and the instance it's being parented under.
+ CreateLink(
+ instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(), undoBatch.GetUndoBatch(),
+ AZStd::move(patch));
+
for (AZ::Entity* topLevelEntity : topLevelEntities)
{
AZ::EntityId topLevelEntityId = topLevelEntity->GetId();
@@ -206,6 +180,39 @@ namespace AzToolsFramework
return AZ::Success();
}
+ PrefabDom PrefabPublicHandler::ApplyContainerTransformAndGeneratePatch(AZ::EntityId containerEntityId, AZ::EntityId commonRootEntityId, const EntityList& topLevelEntities)
+ {
+ AZ::Entity* containerEntity = GetEntityById(containerEntityId);
+
+ // Generate the transform for the container entity out of the top level entities, and set it
+ // This step needs to be done before anything is parented to the container, else children position will be wrong
+ Prefab::PrefabDom containerEntityDomBefore;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
+
+ AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero());
+ AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero());
+
+ // Set container entity to be child of common root
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId);
+
+ // Set the transform (translation, rotation) of the container entity
+ GenerateContainerEntityTransform(topLevelEntities, containerEntityTranslation, containerEntityRotation);
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation);
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation);
+
+ PrefabDom containerEntityDomAfter;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
+
+ PrefabDom patch;
+ m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
+ m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
+
+ // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
+ m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
+
+ return AZStd::move(patch);
+ }
+
PrefabOperationResult PrefabPublicHandler::InstantiatePrefab(
AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position)
{
@@ -271,8 +278,7 @@ namespace AzToolsFramework
PrefabUndoHelpers::UpdatePrefabInstance(
instanceToParentUnder->get(), "Update prefab instance", instanceToParentUnderDomBeforeCreate, undoBatch.GetUndoBatch());
- PrefabDom emptyPatch;
- CreateLink(instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(), undoBatch.GetUndoBatch(), emptyPatch);
+ CreateLink(instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(), undoBatch.GetUndoBatch(), {});
AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId();
// Apply position
@@ -344,7 +350,7 @@ namespace AzToolsFramework
void PrefabPublicHandler::CreateLink(
Instance& sourceInstance, TemplateId targetTemplateId,
- UndoSystem::URSequencePoint* undoBatch, PrefabDom& patch, const bool isUndoRedoSupportNeeded)
+ UndoSystem::URSequencePoint* undoBatch, PrefabDom patch, const bool isUndoRedoSupportNeeded)
{
LinkId linkId;
if (isUndoRedoSupportNeeded)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
index 583def2219..d6763cab40 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
@@ -69,6 +69,9 @@ namespace AzToolsFramework
InstanceOptionalReference GetOwnerInstanceByEntityId(AZ::EntityId entityId) const;
bool EntitiesBelongToSameInstance(const EntityIdList& entityIds) const;
+ PrefabDom ApplyContainerTransformAndGeneratePatch(
+ AZ::EntityId containerEntityId, AZ::EntityId commonRootEntityId, const EntityList& topLevelEntities);
+
/**
* Creates a link between the templates of an instance and its parent.
*
@@ -80,7 +83,7 @@ namespace AzToolsFramework
*/
void CreateLink(
Instance& sourceInstance, TemplateId targetTemplateId, UndoSystem::URSequencePoint* undoBatch,
- PrefabDom& patch, const bool isUndoRedoSupportNeeded = true);
+ PrefabDom patch, const bool isUndoRedoSupportNeeded = true);
/**
* Removes the link between template of the sourceInstance and the template corresponding to targetTemplateId.
From 8792cac88a863d9b1daacf6d6964c5d58af80062 Mon Sep 17 00:00:00 2001
From: sconel
Date: Mon, 17 May 2021 18:50:21 -0700
Subject: [PATCH 031/132] Updating SpawnableEntitiesManager to handle entity
references during spawn
---
.../Spawnable/SpawnableEntitiesManager.cpp | 28 ++++++++++++++-----
.../Spawnable/SpawnableEntitiesManager.h | 7 ++++-
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp
index 3ab004b516..ac71b9fed8 100644
--- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp
@@ -11,6 +11,7 @@
*/
#include
+#include
#include
#include
#include
@@ -200,11 +201,13 @@ namespace AzFramework
}
}
- AZ::Entity* SpawnableEntitiesManager::SpawnSingleEntity(const AZ::Entity& entityTemplate, AZ::SerializeContext& serializeContext)
+ AZ::Entity* SpawnableEntitiesManager::SpawnSingleEntity(const AZ::Entity& entityTemplate, EntityIdMap& spawnableToInstanceEntityIdMap,
+ AZ::SerializeContext& serializeContext)
{
- AZ::Entity* clone = serializeContext.CloneObject(&entityTemplate);
+ AZ::Entity* clone = AZ::IdUtils::Remapper::CloneObjectAndGenerateNewIdsAndFixRefs(
+ &entityTemplate, spawnableToInstanceEntityIdMap, &serializeContext);
+
AZ_Assert(clone != nullptr, "Failed to clone spawnable entity.");
- clone->SetId(AZ::Entity::MakeId());
GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, clone);
return clone;
}
@@ -217,13 +220,16 @@ namespace AzFramework
size_t spawnedEntitiesCount = ticket.m_spawnedEntities.size();
const Spawnable::EntityList& entities = ticket.m_spawnable->GetEntities();
+ EntityIdMap& spawnableToInstanceEntityIdMap = ticket.m_spawnableToInstanceEntityIdMap;
+
size_t entitiesSize = entities.size();
ticket.m_spawnedEntities.reserve(ticket.m_spawnedEntities.size() + entitiesSize);
ticket.m_spawnedEntityIndices.reserve(ticket.m_spawnedEntityIndices.size() + entitiesSize);
+ spawnableToInstanceEntityIdMap.reserve(entitiesSize);
for(size_t i=0; iGetEntities();
+ EntityIdMap& spawnableToInstanceEntityIdMap = ticket.m_spawnableToInstanceEntityIdMap;
+
size_t entitiesSize = entities.size();
ticket.m_spawnedEntities.reserve(ticket.m_spawnedEntities.size() + entitiesSize);
ticket.m_spawnedEntityIndices.reserve(ticket.m_spawnedEntityIndices.size() + entitiesSize);
+ spawnableToInstanceEntityIdMap.reserve(entitiesSize);
for (size_t index : request.m_entityIndices)
{
- ticket.m_spawnedEntities.push_back(SpawnSingleEntity(*entities[index], serializeContext));
+ ticket.m_spawnedEntities.push_back(SpawnSingleEntity(*entities[index], spawnableToInstanceEntityIdMap, serializeContext));
ticket.m_spawnedEntityIndices.push_back(index);
}
ticket.m_loadAll = false;
@@ -337,6 +346,8 @@ namespace AzFramework
// Rebuild the list of entities.
ticket.m_spawnedEntities.clear();
const Spawnable::EntityList& entities = request.m_spawnable->GetEntities();
+ EntityIdMap& spawnableToInstanceEntityIdMap = ticket.m_spawnableToInstanceEntityIdMap;
+
if (ticket.m_loadAll)
{
// The new spawnable may have a different number of entities and since the intent of the user was
@@ -346,7 +357,9 @@ namespace AzFramework
size_t entitiesSize = entities.size();
for (size_t i = 0; i < entitiesSize; ++i)
{
- ticket.m_spawnedEntities.push_back(SpawnSingleEntity(*entities[i], serializeContext));
+ ticket.m_spawnedEntities.push_back(
+ SpawnSingleEntity(*entities[i], spawnableToInstanceEntityIdMap, serializeContext));
+
ticket.m_spawnedEntityIndices.push_back(i);
}
}
@@ -356,7 +369,8 @@ namespace AzFramework
for (size_t index : ticket.m_spawnedEntityIndices)
{
ticket.m_spawnedEntities.push_back(
- index < entitiesSize ? SpawnSingleEntity(*entities[index], serializeContext) : nullptr);
+ index < entitiesSize ?
+ SpawnSingleEntity(*entities[index], spawnableToInstanceEntityIdMap, serializeContext) : nullptr);
}
}
ticket.m_spawnable = AZStd::move(request.m_spawnable);
diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h
index c70b9ccaa6..b101268c5f 100644
--- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h
+++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h
@@ -29,6 +29,8 @@ namespace AZ
namespace AzFramework
{
+ using EntityIdMap = AZStd::unordered_map;
+
class SpawnableEntitiesManager
: public SpawnableEntitiesInterface::Registrar
{
@@ -81,6 +83,8 @@ namespace AzFramework
AZStd::vector m_spawnedEntities;
AZStd::vector m_spawnedEntityIndices;
+ EntityIdMap m_spawnableToInstanceEntityIdMap;
+
AZ::Data::Asset m_spawnable;
uint32_t m_nextTicketId{ 0 }; //!< Next id for this ticket.
uint32_t m_currentTicketId{ 0 }; //!< The id for the command that should be executed.
@@ -140,7 +144,8 @@ namespace AzFramework
using Requests = AZStd::variant;
- AZ::Entity* SpawnSingleEntity(const AZ::Entity& entityTemplate, AZ::SerializeContext& serializeContext);
+ AZ::Entity* SpawnSingleEntity(const AZ::Entity& entityTemplate, EntityIdMap& spawnableToInstanceEntityIdMap,
+ AZ::SerializeContext& serializeContext);
bool ProcessRequest(SpawnAllEntitiesCommand& request, AZ::SerializeContext& serializeContext);
bool ProcessRequest(SpawnEntitiesCommand& request, AZ::SerializeContext& serializeContext);
From 83f29f4a3443de16c793e28d12848bc77889bae7 Mon Sep 17 00:00:00 2001
From: moudgils
Date: Mon, 17 May 2021 20:39:39 -0700
Subject: [PATCH 032/132] Updated to one Dxc package
---
Gems/Atom/Asset/Shader/Code/CMakeLists.txt | 1 -
.../ShaderResourceGroups/BindlessPrototypeSrg.azsli | 10 +++++-----
.../Platform/Windows/BuiltInPackages_windows.cmake | 3 +--
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt
index 7d82ca5869..a06aa79d24 100644
--- a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt
+++ b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt
@@ -98,7 +98,6 @@ ly_add_target(
Gem::Atom_RPI.Edit
RUNTIME_DEPENDENCIES
3rdParty::DirectXShaderCompilerDxc
- 3rdParty::DirectXShaderCompilerDxcAz
3rdParty::SPIRVCross
3rdParty::azslc
)
diff --git a/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/BindlessPrototypeSrg.azsli b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/BindlessPrototypeSrg.azsli
index 7304af9e1e..0b7224019d 100644
--- a/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/BindlessPrototypeSrg.azsli
+++ b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/BindlessPrototypeSrg.azsli
@@ -29,6 +29,11 @@ ShaderResourceGroupSemantic FloatBufferSemanticId
FrequencyId = 7;
};
+ShaderResourceGroup FloatBufferSrg : FloatBufferSemanticId
+{
+ StructuredBuffer m_floatBuffer;
+};
+
ShaderResourceGroup ImageSrg : FrequencyPerScene
{
Sampler m_sampler
@@ -43,11 +48,6 @@ ShaderResourceGroup ImageSrg : FrequencyPerScene
Texture2D m_textureArray[];
}
-ShaderResourceGroup FloatBufferSrg : FloatBufferSemanticId
-{
- StructuredBuffer m_floatBuffer;
-};
-
// Helper functions to read data from the FloatBuffer. The FloatBuffer is accessed with a descriptor and a index.
// The descriptor holds the initial offset within the FloatBuffer, and the index is a sub-index, which increments with each property that is being read.
// The data needs to be read in the same order as it is allocated on the host.
diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake
index 9b202f2eb2..78c9dc7336 100644
--- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake
+++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake
@@ -28,8 +28,7 @@ ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform
ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665)
ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4)
ly_associate_package(PACKAGE_NAME SPIRVCross-2020.04.20-rev1-multiplatform TARGETS SPIRVCross PACKAGE_HASH 7c8c0eaa0166c26745c62d2238525af7e27ac058a5db3defdbaec1878e8798dd)
-ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxcAz-5.0.0_az-rev1-multiplatform TARGETS DirectXShaderCompilerDxcAz PACKAGE_HASH 94f24989a7a371d840b513aa5ffaff02747b3d19b119bc1f899427e29978f753)
-ly_associate_package(PACKAGE_NAME DirectXShaderCompiler-2021.05.05-rev1-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH b2e34c4a19b8a996c1e488aeb83233abe1985b6502ef644516ef692029b98f6d)
+ly_associate_package(PACKAGE_NAME DirectXShaderCompiler-1.6.2104-o3de-rev1-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 48367b1237c41e17deef3bf39b964665d46daa587de890190fe5dc7224f9beb4)
ly_associate_package(PACKAGE_NAME azslc-1.7.20-rev1-multiplatform TARGETS azslc PACKAGE_HASH 45d55f28bea2ef823ed3204f60df52e5e329f42923923d4555fdbdf3bea0af60)
ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee)
ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5)
From 6dd1985e2d301f618ec7a9a9e5520b734c482b7c Mon Sep 17 00:00:00 2001
From: balibhan
Date: Tue, 18 May 2021 15:06:26 +0530
Subject: [PATCH 033/132] removed unused import
---
.../editor_python_test_tools/pyside_utils.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py
index 10f060bba6..eed6a18614 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py
@@ -18,7 +18,6 @@ from PySide2 import QtCore, QtWidgets, QtGui, QtTest
from PySide2.QtWidgets import QAction, QWidget
from PySide2.QtCore import Qt
from PySide2.QtTest import QTest
-import azlmbr.legacy.general as general
import traceback
import threading
import types
From dff3efbfcad6e8777a335de73085fb3b3a638b37 Mon Sep 17 00:00:00 2001
From: pruiksma
Date: Tue, 18 May 2021 14:01:18 -0500
Subject: [PATCH 034/132] [ATOM-15561] Adding AZ_Error for unhandled pass
binding failure case.
---
Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp
index 1fad385fa6..3f5c16678c 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp
@@ -163,6 +163,11 @@ namespace AZ
binding.m_shaderInputIndex = idx.IsValid() ? static_cast(idx.GetIndex()) : PassAttachmentBinding::ShaderInputNoBind;
}
}
+ else
+ {
+ AZ_Error("Pass System", false, "[Pass %s] Could not bind shader buffer index '%s' because it has no attachment.", GetName().GetCStr(), shaderName.GetCStr());
+ binding.m_shaderInputIndex = PassAttachmentBinding::ShaderInputNoBind;
+ }
}
}
From f087b3be89870dd2740f972c95bbb0f0d11ec809 Mon Sep 17 00:00:00 2001
From: puvvadar
Date: Tue, 18 May 2021 12:13:03 -0700
Subject: [PATCH 035/132] AutoComponent jinja formatting
---
.../Source/AutoGen/AutoComponent_Source.jinja | 64 ++++++++++---------
1 file changed, 33 insertions(+), 31 deletions(-)
diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja
index 41666264e0..751b55be86 100644
--- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja
+++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja
@@ -1121,9 +1121,9 @@ namespace {{ Component.attrib['Namespace'] }}
void {{ RecordName }}::SetPredictableBits()
{
{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Client')|indent(8) -}}
-{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Server')|indent(8) -}}
-{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Autonomous')|indent(8) -}}
-{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Autonomous', 'Authority')|indent(8) }}
+ {{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Server')|indent(8) -}}
+ {{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Autonomous')|indent(8) -}}
+ {{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Autonomous', 'Authority')|indent(8) }}
}
{% if NetworkInputCount > 0 %}
@@ -1186,22 +1186,22 @@ namespace {{ Component.attrib['Namespace'] }}
}
{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Authority', false, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Authority', true, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Server', false, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Server', true, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Client', false, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Client', true, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', false, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', true, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', false, ControllerBaseName)|indent(4) -}}
-{{ DefineNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', true, ControllerBaseName)|indent(4) }}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Authority', true, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Server', false, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Server', true, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Client', false, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Client', true, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', false, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', true, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', false, ControllerBaseName)|indent(4) -}}
+ {{ DefineNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', true, ControllerBaseName)|indent(4) }}
{{ DefineArchetypePropertyGets(Component, ClassType, ControllerBaseName, "GetParent().")|indent(4) -}}
-{{ DefineRpcInvocations(Component, ControllerBaseName, 'Autonomous', 'Authority', false)|indent(4) -}}
-{{ DefineRpcInvocations(Component, ControllerBaseName, 'Autonomous', 'Authority', true)|indent(4) -}}
-{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Autonomous', false)|indent(4) -}}
-{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Autonomous', true)|indent(4) -}}
-{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Client', false)|indent(4) -}}
-{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Client', true)|indent(4) }}
+ {{ DefineRpcInvocations(Component, ControllerBaseName, 'Autonomous', 'Authority', false)|indent(4) -}}
+ {{ DefineRpcInvocations(Component, ControllerBaseName, 'Autonomous', 'Authority', true)|indent(4) -}}
+ {{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Autonomous', false)|indent(4) -}}
+ {{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Autonomous', true)|indent(4) -}}
+ {{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Client', false)|indent(4) -}}
+ {{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Client', true)|indent(4) }}
{% for Service in Component.iter('ComponentRelation') %}
{% if (Service.attrib['HasController']|booleanTrue) and (Service.attrib['Constraint'] != 'Incompatible') %}
{{ Service.attrib['Namespace'] }}::{{ Service.attrib['Name'] }}Controller* {{ ControllerBaseName }}::Get{{ Service.attrib['Name'] }}Controller()
@@ -1221,10 +1221,10 @@ namespace {{ Component.attrib['Namespace'] }}
serializeContext->Class<{{ ComponentBaseName }}, Multiplayer::MultiplayerComponent>()
->Version(1)
{{ DefineNetworkPropertyReflection(Component, 'Authority', 'Authority', ComponentBaseName)|indent(16) -}}
-{{ DefineNetworkPropertyReflection(Component, 'Authority', 'Server', ComponentBaseName)|indent(16) -}}
-{{ DefineNetworkPropertyReflection(Component, 'Authority', 'Client', ComponentBaseName)|indent(16) -}}
-{{ DefineNetworkPropertyReflection(Component, 'Authority', 'Autonomous', ComponentBaseName)|indent(16) -}}
-{{ DefineNetworkPropertyReflection(Component, 'Autonomous', 'Authority', ComponentBaseName)|indent(16) }}
+ {{ DefineNetworkPropertyReflection(Component, 'Authority', 'Server', ComponentBaseName)|indent(16) -}}
+ {{ DefineNetworkPropertyReflection(Component, 'Authority', 'Client', ComponentBaseName)|indent(16) -}}
+ {{ DefineNetworkPropertyReflection(Component, 'Authority', 'Autonomous', ComponentBaseName)|indent(16) -}}
+ {{ DefineNetworkPropertyReflection(Component, 'Autonomous', 'Authority', ComponentBaseName)|indent(16) }}
{{ DefineArchetypePropertyReflection(Component, ComponentBaseName)|indent(16) }};
}
ReflectToEditContext(context);
@@ -1244,10 +1244,10 @@ namespace {{ Component.attrib['Namespace'] }}
->Attribute(AZ::Edit::Attributes::Category, "{{ Component.attrib['Namespace'] }}")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
{{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Authority', ComponentBaseName)|indent(20) -}}
-{{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Server', ComponentBaseName)|indent(20) -}}
-{{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Client', ComponentBaseName)|indent(20) -}}
-{{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Autonomous', ComponentBaseName)|indent(20) -}}
-{{ DefineNetworkPropertyEditReflection(Component, 'Autonomous', 'Authority', ComponentBaseName)|indent(20) }}
+ {{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Server', ComponentBaseName)|indent(20) -}}
+ {{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Client', ComponentBaseName)|indent(20) -}}
+ {{ DefineNetworkPropertyEditReflection(Component, 'Authority', 'Autonomous', ComponentBaseName)|indent(20) -}}
+ {{ DefineNetworkPropertyEditReflection(Component, 'Autonomous', 'Authority', ComponentBaseName)|indent(20) }}
{{ DefineArchetypePropertyEditReflection(Component, ComponentBaseName)|indent(20) }};
{% if ComponentDerived %}
@@ -1275,12 +1275,14 @@ namespace {{ Component.attrib['Namespace'] }}
{{ DefineNetworkPropertyBehaviorReflection(Component, 'Authority', 'Client', ComponentName) | indent(16) -}}
{{ DefineNetworkPropertyBehaviorReflection(Component, 'Authority', 'Autonomous', ComponentName) | indent(16) -}}
{{ DefineNetworkPropertyBehaviorReflection(Component, 'Autonomous', 'Authority', ComponentName) | indent(16) -}}
+
+ // Reflect RPCs
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Server', 'Authority')|indent(4) -}}
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Autonomous', 'Authority')|indent(4) -}}
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Authority', 'Autonomous')|indent(4) -}}
+ {{ ReflectRpcInvocations(Component, ComponentName, 'Authority', 'Client')|indent(4) -}}
+
{{- DefineArchetypePropertyBehaviorReflection(Component, ComponentName) | indent(16) }}
-
- {{ ReflectRpcInvocations(Component, ComponentName, 'Server', 'Authority')|indent(16) -}}
- {{ ReflectRpcInvocations(Component, ComponentName, 'Autonomous', 'Authority')|indent(16) -}}
- {{ ReflectRpcInvocations(Component, ComponentName, 'Authority', 'Autonomous')|indent(16) -}}
- {{ ReflectRpcInvocations(Component, ComponentName, 'Authority', 'Client')|indent(16) -}}
;
}
}
From 0959756f738598ef42ff87ac3d311c181ef8b513 Mon Sep 17 00:00:00 2001
From: Chris Galvan
Date: Tue, 18 May 2021 15:05:12 -0500
Subject: [PATCH 036/132] [LYN-2255] Implemented duplication of entities with
prefabs.
---
.../AzToolsFramework/API/EditorEntityAPI.h | 15 ++
.../Application/EditorEntityManager.cpp | 22 ++-
.../Application/EditorEntityManager.h | 3 +
.../AzToolsFramework/Prefab/PrefabDomUtils.h | 1 +
.../Prefab/PrefabPublicHandler.cpp | 173 +++++++++++++++++-
.../Prefab/PrefabPublicHandler.h | 3 +-
.../Prefab/PrefabPublicInterface.h | 7 +
.../SandboxIntegration.cpp | 21 ++-
.../SandboxIntegration.h | 2 +
9 files changed, 238 insertions(+), 9 deletions(-)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h
index f51af58c51..6c230ff5c7 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h
@@ -52,6 +52,21 @@ namespace AzToolsFramework
* Deletes all entities in the provided list, as well as their transform descendants.
*/
virtual void DeleteEntitiesAndAllDescendants(const EntityIdList& entities) = 0;
+
+ /**
+ * Duplicate all currently-selected entities.
+ */
+ virtual void DuplicateSelected() = 0;
+
+ /**
+ * Duplicates the specified entity.
+ */
+ virtual void DuplicateEntityById(AZ::EntityId entityId) = 0;
+
+ /**
+ * Duplicates all specified entities.
+ */
+ virtual void DuplicateEntities(const EntityIdList& entities) = 0;
};
} // namespace AzToolsFramework
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp
index 80d7fc7c5a..880217e807 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp
@@ -43,7 +43,7 @@ namespace AzToolsFramework
void EditorEntityManager::DeleteEntityById(AZ::EntityId entityId)
{
- DeleteEntities({entityId});
+ DeleteEntities(EntityIdList{ entityId });
}
void EditorEntityManager::DeleteEntities(const EntityIdList& entities)
@@ -53,12 +53,30 @@ namespace AzToolsFramework
void EditorEntityManager::DeleteEntityAndAllDescendants(AZ::EntityId entityId)
{
- DeleteEntitiesAndAllDescendants({entityId});
+ DeleteEntitiesAndAllDescendants(EntityIdList{ entityId });
}
void EditorEntityManager::DeleteEntitiesAndAllDescendants(const EntityIdList& entities)
{
m_prefabPublicInterface->DeleteEntitiesAndAllDescendantsInInstance(entities);
}
+
+ void EditorEntityManager::DuplicateSelected()
+ {
+ EntityIdList selectedEntities;
+ ToolsApplicationRequestBus::BroadcastResult(selectedEntities, &ToolsApplicationRequests::GetSelectedEntities);
+
+ m_prefabPublicInterface->DuplicateEntitiesInInstance(selectedEntities);
+ }
+
+ void EditorEntityManager::DuplicateEntityById(AZ::EntityId entityId)
+ {
+ DuplicateEntities(EntityIdList{ entityId });
+ }
+
+ void EditorEntityManager::DuplicateEntities(const EntityIdList& entities)
+ {
+ m_prefabPublicInterface->DuplicateEntitiesInInstance(entities);
+ }
}
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h
index 580ad22bda..939f73729e 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h
@@ -31,6 +31,9 @@ namespace AzToolsFramework
void DeleteEntities(const EntityIdList& entities) override;
void DeleteEntityAndAllDescendants(AZ::EntityId entityId) override;
void DeleteEntitiesAndAllDescendants(const EntityIdList& entities) override;
+ void DuplicateSelected() override;
+ void DuplicateEntityById(AZ::EntityId entityId) override;
+ void DuplicateEntities(const EntityIdList& entities) override;
private:
Prefab::PrefabPublicInterface* m_prefabPublicInterface = nullptr;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h
index 5ee91c85ae..4feecb9da3 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h
@@ -28,6 +28,7 @@ namespace AzToolsFramework
inline static const char* PatchesName = "Patches";
inline static const char* SourceName = "Source";
inline static const char* LinkIdName = "LinkId";
+ inline static const char* EntityIdName = "Id";
inline static const char* EntitiesName = "Entities";
inline static const char* ContainerEntityName = "ContainerEntity";
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
index 200a5c96fb..549830d24e 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
@@ -13,6 +13,8 @@
#include
#include
+#include
+#include
#include
#include
@@ -31,6 +33,8 @@
#include
#include
+#include
+
namespace AzToolsFramework
{
namespace Prefab
@@ -631,6 +635,166 @@ namespace AzToolsFramework
return DeleteFromInstance(entityIds, true);
}
+ PrefabOperationResult PrefabPublicHandler::DuplicateEntitiesInInstance(const EntityIdList& entityIds)
+ {
+ if (entityIds.empty())
+ {
+ return AZ::Success();
+ }
+
+ if (!EntitiesBelongToSameInstance(entityIds))
+ {
+ return AZ::Failure(AZStd::string("DuplicateEntitiesInInstance - Duplication Error. Cannot duplicate multiple "
+ "entities belonging to different instances with one operation."));
+ }
+
+ // We've already verified the entities are all owned by the same instance,
+ // so we can just retrieve our instance from the first entity in the list.
+ InstanceOptionalReference instance = GetOwnerInstanceByEntityId(entityIds[0]);
+
+ // This will cull out any entities that have ancestors in the list, since we will end up duplicating
+ // the full nested hierarchy with what is returned from RetrieveAndSortPrefabEntitiesAndInstances
+ AzToolsFramework::EntityIdSet duplicationSet = AzToolsFramework::GetCulledEntityHierarchy(entityIds);
+
+ AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework);
+
+ UndoSystem::URSequencePoint* currentUndoBatch = nullptr;
+ ToolsApplicationRequests::Bus::BroadcastResult(currentUndoBatch, &ToolsApplicationRequests::Bus::Events::GetCurrentUndoBatch);
+
+ bool createdUndo = false;
+ if (!currentUndoBatch)
+ {
+ createdUndo = true;
+ ToolsApplicationRequests::Bus::BroadcastResult(
+ currentUndoBatch, &ToolsApplicationRequests::Bus::Events::BeginUndoBatch, "Duplicate Entities");
+ AZ_Assert(currentUndoBatch, "Failed to create new undo batch.");
+ }
+
+ // In order to undo DuplicateEntitiesInInstance, we have to create a selection command which selects the current selection
+ // and then add the duplication as children.
+ // Commands always execute themselves first and then their children (when going forwards)
+ // and do the opposite when going backwards.
+ EntityIdList selectedEntities;
+ ToolsApplicationRequestBus::BroadcastResult(selectedEntities, &ToolsApplicationRequests::GetSelectedEntities);
+ SelectionCommand* selCommand = aznew SelectionCommand(selectedEntities, "Duplicate Entities");
+
+ // We insert a "deselect all" command before we duplicate the entities. This ensures the duplicate operations aren't changing
+ // selection state, which triggers expensive UI updates. By deselecting up front, we are able to do those expensive
+ // UI updates once at the start instead of once for each entity.
+ {
+ EntityIdList deselection;
+ SelectionCommand* deselectAllCommand = aznew SelectionCommand(deselection, "Deselect Entities");
+ deselectAllCommand->SetParent(selCommand);
+ }
+
+ {
+ AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "DuplicateEntitiesInInstance::UndoCaptureAndDuplicateEntities");
+
+ // Take a snapshot of the instance DOM before we manipulate it
+ Prefab::PrefabDom instanceDomBefore;
+ m_instanceToTemplateInterface->GenerateDomForInstance(instanceDomBefore, instance->get());
+
+ AZStd::vector entities;
+ AZStd::vector> instances;
+
+ // Gather all entities/instances in the hierarchy, but don't detach them because we are duplicating not deleting.
+ EntityList inputEntityList = EntityIdSetToEntityList(duplicationSet);
+ bool success = RetrieveAndSortPrefabEntitiesAndInstances(inputEntityList, instance->get(), entities, instances, false);
+
+ if (!success)
+ {
+ return AZ::Failure(AZStd::string("DuplicateEntitiesInInstance"));
+ }
+
+ // Make a copy of our before instance DOM where we will add our duplicated entities
+ Prefab::PrefabDom instanceDomAfter;
+ instanceDomAfter.CopyFrom(instanceDomBefore, instanceDomAfter.GetAllocator());
+
+ AZStd::unordered_map oldAliasToNewAliasMap;
+ AZStd::unordered_map aliasToEntityDomMap;
+
+ for (AZ::Entity* entity : entities)
+ {
+ EntityAliasOptionalReference oldAliasRef = instance->get().GetEntityAlias(entity->GetId());
+ AZ_Assert(oldAliasRef.has_value(), "No alias found for Entity in the DOM");
+ EntityAlias oldAlias = oldAliasRef.value();
+
+ // Give this the outer allocator so that the memory reference will be valid when
+ // it gets used for AddMember
+ Prefab::PrefabDom entityDomBefore(&instanceDomAfter.GetAllocator());
+ m_instanceToTemplateInterface->GenerateDomForEntity(entityDomBefore, *entity);
+
+ // Keep track of the old alias <-> new alias mapping for this duplicated entity
+ // so we can fixup references later
+ EntityAlias newEntityAlias = Instance::GenerateEntityAlias();
+ oldAliasToNewAliasMap.insert(AZStd::make_pair(oldAlias, newEntityAlias));
+
+ // Update the Entity Id in the Entity DOM for the duplicated Entity
+ auto entityIdIter = entityDomBefore.FindMember(PrefabDomUtils::EntityIdName);
+ if (entityIdIter != entityDomBefore.MemberEnd())
+ {
+ entityIdIter->value.SetString(newEntityAlias.c_str(), newEntityAlias.length(), entityDomBefore.GetAllocator());
+ }
+
+ rapidjson::StringBuffer buffer;
+ buffer.Clear();
+
+ rapidjson::Writer writer(buffer);
+ entityDomBefore.Accept(writer);
+
+ // Store our duplicated Entity DOM with its new alias as a string
+ // so that we can fixup entity alias references before adding it
+ // to the Entities member of our instance DOM
+ QString entityDomString(buffer.GetString());
+ aliasToEntityDomMap.insert(AZStd::make_pair(newEntityAlias, entityDomString));
+ }
+
+ auto entitiesIter = instanceDomAfter.FindMember(PrefabDomUtils::EntitiesName);
+ AZ_Assert(entitiesIter != instanceDomAfter.MemberEnd(), "Instance DOM missing the Entities member.");
+
+ // Now that all the duplicated Entity DOMs have been created, we need to iterate
+ // through them and replace any previous EntityAlias references with the new ones.
+ // These are more than just parent entity references for nested entities, this will
+ // also cover any EntityId references that were made in the components between them.
+ for (auto aliasEntityPair : aliasToEntityDomMap)
+ {
+ EntityAlias newEntityAlias = aliasEntityPair.first;
+ QString newEntityDomString = aliasEntityPair.second;
+
+ // Replace all of the old alias references with the new ones
+ for (auto aliasMapIter : oldAliasToNewAliasMap)
+ {
+ newEntityDomString.replace(aliasMapIter.first.c_str(), aliasMapIter.second.c_str());
+ }
+
+ // Create the new Entity DOM from parsing the JSON string
+ Prefab::PrefabDom entityDomAfter(&instanceDomAfter.GetAllocator());
+ entityDomAfter.Parse(newEntityDomString.toUtf8().constData());
+
+ // Add the new Entity DOM to the Entities member of the instance
+ rapidjson::Value aliasName(newEntityAlias.c_str(), newEntityAlias.length(), instanceDomAfter.GetAllocator());
+ entitiesIter->value.AddMember(AZStd::move(aliasName), entityDomAfter, instanceDomAfter.GetAllocator());
+ }
+
+ PrefabUndoInstance* command = aznew PrefabUndoInstance("Instance duplication");
+ command->Capture(instanceDomBefore, instanceDomAfter, instance->get().GetTemplateId());
+ command->SetParent(selCommand);
+ }
+
+ selCommand->SetParent(currentUndoBatch);
+ {
+ AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "DuplicateEntitiesInInstance:RunRedo");
+ selCommand->RunRedo();
+ }
+
+ if (createdUndo)
+ {
+ ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::EndUndoBatch);
+ }
+
+ return AZ::Success();
+ }
+
PrefabOperationResult PrefabPublicHandler::DeleteFromInstance(const EntityIdList& entityIds, bool deleteDescendants)
{
if (entityIds.empty())
@@ -865,7 +1029,8 @@ namespace AzToolsFramework
bool PrefabPublicHandler::RetrieveAndSortPrefabEntitiesAndInstances(
const EntityList& inputEntities, Instance& commonRootEntityOwningInstance,
- EntityList& outEntities, AZStd::vector>& outInstances) const
+ EntityList& outEntities, AZStd::vector>& outInstances,
+ bool shouldDetach) const
{
if (inputEntities.size() == 0)
{
@@ -949,14 +1114,16 @@ namespace AzToolsFramework
for (AZ::Entity* entity : entities)
{
- outEntities.emplace_back(commonRootEntityOwningInstance.DetachEntity(entity->GetId()).release());
+ AZ::Entity* outEntity = (shouldDetach) ? commonRootEntityOwningInstance.DetachEntity(entity->GetId()).release() : entity;
+ outEntities.emplace_back(outEntity);
}
outInstances.clear();
outInstances.reserve(instances.size());
for (Instance* instancePtr : instances)
{
- outInstances.push_back(AZStd::move(commonRootEntityOwningInstance.DetachNestedInstance(instancePtr->GetInstanceAlias())));
+ AZStd::unique_ptr outInstance = (shouldDetach) ? commonRootEntityOwningInstance.DetachNestedInstance(instancePtr->GetInstanceAlias()) : AZStd::unique_ptr(instancePtr);
+ outInstances.push_back(AZStd::move(outInstance));
}
return (outEntities.size() + outInstances.size()) > 0;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
index d88086dda9..b6128f0ab9 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
@@ -60,11 +60,12 @@ namespace AzToolsFramework
PrefabOperationResult DeleteEntitiesInInstance(const EntityIdList& entityIds) override;
PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) override;
+ PrefabOperationResult DuplicateEntitiesInInstance(const EntityIdList& entityIds) override;
private:
PrefabOperationResult DeleteFromInstance(const EntityIdList& entityIds, bool deleteDescendants);
bool RetrieveAndSortPrefabEntitiesAndInstances(const EntityList& inputEntities, Instance& commonRootEntityOwningInstance,
- EntityList& outEntities, AZStd::vector>& outInstances) const;
+ EntityList& outEntities, AZStd::vector>& outInstances, bool shouldDetach = true) const;
InstanceOptionalReference GetOwnerInstanceByEntityId(AZ::EntityId entityId) const;
bool EntitiesBelongToSameInstance(const EntityIdList& entityIds) const;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h
index 1a8da0dfe0..0750c4d264 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h
@@ -143,6 +143,13 @@ namespace AzToolsFramework
* @return An outcome object; on failure, it comes with an error message detailing the cause of the error.
*/
virtual PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) = 0;
+
+ /**
+ * Duplicates all entities in the owning instance. Bails if the entities don't all belong to the same instance.
+ * @param entities The entities to duplicate.
+ * @return An outcome object; on failure, it comes with an error message detailing the cause of the error.
+ */
+ virtual PrefabOperationResult DuplicateEntitiesInInstance(const EntityIdList& entityIds) = 0;
};
} // namespace Prefab
diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp
index 027487a435..d36c20c56a 100644
--- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp
+++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp
@@ -35,6 +35,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -192,6 +193,9 @@ void SandboxIntegrationManager::Setup()
(m_prefabIntegrationInterface != nullptr),
"SandboxIntegrationManager requires a PrefabIntegrationInterface instance to be present on Setup().");
+ m_editorEntityAPI = AZ::Interface::Get();
+ AZ_Assert(m_editorEntityAPI, "SandboxIntegrationManager requires an EditorEntityAPI instance to be present on Setup().");
+
AzToolsFramework::Layers::EditorLayerComponentNotificationBus::Handler::BusConnect();
}
@@ -1215,9 +1219,20 @@ void SandboxIntegrationManager::CloneSelection(bool& handled)
if (!duplicationSet.empty())
{
- AZStd::unordered_set clonedEntities;
- handled = AzToolsFramework::CloneInstantiatedEntities(duplicationSet, clonedEntities);
- m_unsavedEntities.insert(clonedEntities.begin(), clonedEntities.end());
+ bool prefabSystemEnabled = false;
+ AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
+
+ if (prefabSystemEnabled)
+ {
+ m_editorEntityAPI->DuplicateSelected();
+ handled = true;
+ }
+ else
+ {
+ AZStd::unordered_set clonedEntities;
+ handled = AzToolsFramework::CloneInstantiatedEntities(duplicationSet, clonedEntities);
+ m_unsavedEntities.insert(clonedEntities.begin(), clonedEntities.end());
+ }
}
else
{
diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h
index 14f52591a4..528b93e44e 100644
--- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h
+++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h
@@ -77,6 +77,7 @@ class CHyperGraph;
namespace AzToolsFramework
{
+ class EditorEntityAPI;
class EditorEntityUiInterface;
namespace AssetBrowser
@@ -371,6 +372,7 @@ private:
AzToolsFramework::EditorEntityUiInterface* m_editorEntityUiInterface = nullptr;
AzToolsFramework::Prefab::PrefabIntegrationInterface* m_prefabIntegrationInterface = nullptr;
+ AzToolsFramework::EditorEntityAPI* m_editorEntityAPI = nullptr;
// Overrides UI styling and behavior for Layer Entities
AzToolsFramework::LayerUiHandler m_layerUiOverrideHandler;
From c4641f2594d0c9e63058a930b571c64d6b6545fc Mon Sep 17 00:00:00 2001
From: Gene Walters
Date: Tue, 18 May 2021 14:13:01 -0700
Subject: [PATCH 037/132] ScriptCanvas can now check if an entity net-component
is authority, autonomous, server, or client
---
.../Components/MultiplayerComponent.cpp | 76 +++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp
index 8542288b23..ff3b64aa38 100644
--- a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp
+++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp
@@ -24,6 +24,82 @@ namespace Multiplayer
serializeContext->Class()
->Version(1);
}
+
+ AZ::BehaviorContext* behaviorContext = azrtti_cast