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/142] [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/142] 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/142] 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/142] 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 2f4120cdfbbd736d18fdc5f3187a94f6640ed28b Mon Sep 17 00:00:00 2001
From: puvvadar
Date: Mon, 3 May 2021 13:07:11 -0700
Subject: [PATCH 005/142] Update Ctrl+G logic to account for prefab processing
status and timing
---
.../PrefabEditorEntityOwnershipInterface.h | 2 +
.../PrefabEditorEntityOwnershipService.cpp | 5 ++
.../PrefabEditorEntityOwnershipService.h | 2 +
Gems/Multiplayer/Code/CMakeLists.txt | 1 +
.../Code/Include/IMultiplayerTools.h | 39 ++++++++++++
.../MultiplayerEditorSystemComponent.cpp | 63 ++++++++++++-------
.../Editor/MultiplayerEditorSystemComponent.h | 12 +++-
.../Code/Source/MultiplayerToolsModule.cpp | 35 ++++-------
.../Code/Source/MultiplayerToolsModule.h | 27 ++++++++
.../Pipeline/NetworkPrefabProcessor.cpp | 3 +
.../Code/multiplayer_tools_files.cmake | 1 +
11 files changed, 142 insertions(+), 48 deletions(-)
create mode 100644 Gems/Multiplayer/Code/Include/IMultiplayerTools.h
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h
index 19c236f509..4476876b59 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h
@@ -46,6 +46,8 @@ namespace AzToolsFramework
virtual Prefab::InstanceOptionalReference GetRootPrefabInstance() = 0;
+ virtual const AZStd::vector>& GetPlayInEditorAssetData() = 0;
+
virtual bool LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0;
virtual bool SaveToStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp
index 81233069a9..e81d6bf08e 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp
@@ -321,6 +321,11 @@ namespace AzToolsFramework
return *m_rootInstance;
}
+ const AZStd::vector>& PrefabEditorEntityOwnershipService::GetPlayInEditorAssetData()
+ {
+ return m_playInEditorData.m_assets;
+ }
+
void PrefabEditorEntityOwnershipService::OnEntityRemoved(AZ::EntityId entityId)
{
AzFramework::SliceEntityRequestBus::MultiHandler::BusDisconnect(entityId);
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h
index 9c483e61c5..cf62220e67 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h
@@ -195,6 +195,8 @@ namespace AzToolsFramework
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) override;
Prefab::InstanceOptionalReference GetRootPrefabInstance() override;
+
+ const AZStd::vector>& GetPlayInEditorAssetData() override;
//////////////////////////////////////////////////////////////////////////
void OnEntityRemoved(AZ::EntityId entityId);
diff --git a/Gems/Multiplayer/Code/CMakeLists.txt b/Gems/Multiplayer/Code/CMakeLists.txt
index 4eeee15c47..46f56ef315 100644
--- a/Gems/Multiplayer/Code/CMakeLists.txt
+++ b/Gems/Multiplayer/Code/CMakeLists.txt
@@ -119,6 +119,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
BUILD_DEPENDENCIES
PRIVATE
Gem::Multiplayer.Editor.Static
+ Gem::Multiplayer.Tools
)
endif()
diff --git a/Gems/Multiplayer/Code/Include/IMultiplayerTools.h b/Gems/Multiplayer/Code/Include/IMultiplayerTools.h
new file mode 100644
index 0000000000..c621808f7a
--- /dev/null
+++ b/Gems/Multiplayer/Code/Include/IMultiplayerTools.h
@@ -0,0 +1,39 @@
+/*
+* 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
+
+namespace Multiplayer
+{
+ //! IMultiplayer provides insight into the Multiplayer session and its Agents
+ class IMultiplayerTools
+ {
+ public:
+ // NetworkPrefabProcessor is the only class that should be setting process network prefab status
+ friend class NetworkPrefabProcessor;
+
+ AZ_RTTI(IMultiplayerTools, "{E8A80EAB-29CB-4E3B-A0B2-FFCB37060FB0}");
+
+ virtual ~IMultiplayerTools() = default;
+
+ //! Returns if network prefab processing has created currently active or pending spawnables
+ //! @return If network prefab processing has created currently active or pending spawnables
+ virtual bool DidProcessNetworkPrefabs() = 0;
+
+ private:
+ //! Sets if network prefab processing has created currently active or pending spawnables
+ //! @param didProcessNetPrefabs if network prefab processing has created currently active or pending spawnables
+ virtual void SetDidProcessNetworkPrefabs(bool didProcessNetPrefabs) = 0;
+ };
+}
diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp
index aec3e7870f..0850b858a2 100644
--- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp
+++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp
@@ -10,12 +10,14 @@
*
*/
+#include
#include
#include
#include
#include
#include
#include
+#include
namespace Multiplayer
{
@@ -57,12 +59,14 @@ namespace Multiplayer
void MultiplayerEditorSystemComponent::Activate()
{
+ AzFramework::GameEntityContextEventBus::Handler::BusConnect();
AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
}
void MultiplayerEditorSystemComponent::Deactivate()
{
AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect();
+ AzFramework::GameEntityContextEventBus::Handler::BusDisconnect();
}
void MultiplayerEditorSystemComponent::NotifyRegisterViews()
@@ -77,11 +81,42 @@ namespace Multiplayer
{
switch (event)
{
- case eNotify_OnBeginGameMode:
- {
+ case eNotify_OnQuit:
+ AZ_Warning("Multiplayer Editor", m_editor != nullptr, "Multiplayer Editor received On Quit without an Editor pointer.");
+ if (m_editor)
+ {
+ m_editor->UnregisterNotifyListener(this);
+ m_editor = nullptr;
+ }
+ [[fallthrough]];
+ case eNotify_OnEndGameMode:
+ AZ::TickBus::Handler::BusDisconnect();
+ // Kill the configured server if it's active
+ if (m_serverProcess)
+ {
+ m_serverProcess->TerminateProcess(0);
+ m_serverProcess = nullptr;
+ }
+ break;
+ }
+ }
+
+ void MultiplayerEditorSystemComponent::OnGameEntitiesStarted()
+ {
+ // BeginGameMode and Prefab Processing have completed at this point
+ IMultiplayerTools* mpTools = AZ::Interface::Get();
+ if (editorsv_enabled && mpTools != nullptr && mpTools->DidProcessNetworkPrefabs())
+ {
AZ::TickBus::Handler::BusConnect();
- if (editorsv_enabled)
+ auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get();
+ if (!prefabEditorEntityOwnershipInterface)
+ {
+ AZ_Error("MultiplayerEditor", prefabEditorEntityOwnershipInterface != nullptr, "PrefabEditorEntityOwnershipInterface unavailable");
+ }
+ const AZStd::vector>& assetData = prefabEditorEntityOwnershipInterface->GetPlayInEditorAssetData();
+
+ if (assetData.size() > 0)
{
// Assemble the server's path
AZ::CVarFixedString serverProcess = editorsv_process;
@@ -111,33 +146,13 @@ namespace Multiplayer
// Start the configured server if it's available
AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo;
- processLaunchInfo.m_commandlineParameters =
- AZStd::string::format("\"%s\"", serverPath.c_str());
+ processLaunchInfo.m_commandlineParameters = AZStd::string::format("\"%s\"", serverPath.c_str());
processLaunchInfo.m_showWindow = true;
processLaunchInfo.m_processPriority = AzFramework::ProcessPriority::PROCESSPRIORITY_NORMAL;
m_serverProcess = AzFramework::ProcessWatcher::LaunchProcess(
processLaunchInfo, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_NONE);
}
- break;
- }
- case eNotify_OnQuit:
- AZ_Warning("Multiplayer Editor", m_editor != nullptr, "Multiplayer Editor received On Quit without an Editor pointer.");
- if (m_editor)
- {
- m_editor->UnregisterNotifyListener(this);
- m_editor = nullptr;
- }
- [[fallthrough]];
- case eNotify_OnEndGameMode:
- AZ::TickBus::Handler::BusDisconnect();
- // Kill the configured server if it's active
- if (m_serverProcess)
- {
- m_serverProcess->TerminateProcess(0);
- m_serverProcess = nullptr;
- }
- break;
}
}
diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h
index 8c18a2e57a..31ecdf83a3 100644
--- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h
+++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h
@@ -19,6 +19,7 @@
#include
#include
+#include
#include
#include
@@ -34,6 +35,7 @@ namespace Multiplayer
class MultiplayerEditorSystemComponent final
: public AZ::Component
, private AZ::TickBus::Handler
+ , private AzFramework::GameEntityContextEventBus::Handler
, private AzToolsFramework::EditorEvents::Bus::Handler
, private IEditorNotifyListener
{
@@ -66,8 +68,16 @@ namespace Multiplayer
void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
int GetTickOrder() override;
//! @}
- //!
+
+ //! EditorEvents::Handler overrides
+ //! @{
void OnEditorNotifyEvent(EEditorNotifyEvent event) override;
+ //! @}
+
+ //! GameEntityContextEventBus::Handler overrides
+ //! @{
+ void OnGameEntitiesStarted() override;
+ //! @}
IEditor* m_editor = nullptr;
AzFramework::ProcessWatcher* m_serverProcess = nullptr;
diff --git a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp
index 5a223d6214..a5df3c1dc5 100644
--- a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp
+++ b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp
@@ -18,32 +18,21 @@
namespace Multiplayer
{
- //! Multiplayer Tools system component provides serialize context reflection for tools-only systems.
- class MultiplayerToolsSystemComponent final
- : public AZ::Component
+
+ void MultiplayerToolsSystemComponent::Reflect(AZ::ReflectContext* context)
{
- public:
- AZ_COMPONENT(MultiplayerToolsSystemComponent, "{65AF5342-0ECE-423B-B646-AF55A122F72B}");
+ NetworkPrefabProcessor::Reflect(context);
+ }
- static void Reflect(AZ::ReflectContext* context)
- {
- NetworkPrefabProcessor::Reflect(context);
- }
+ bool MultiplayerToolsSystemComponent::DidProcessNetworkPrefabs()
+ {
+ return m_didProcessNetPrefabs;
+ }
- MultiplayerToolsSystemComponent() = default;
- ~MultiplayerToolsSystemComponent() override = default;
-
- /// AZ::Component overrides.
- void Activate() override
- {
-
- }
-
- void Deactivate() override
- {
-
- }
- };
+ void MultiplayerToolsSystemComponent::SetDidProcessNetworkPrefabs(bool didProcessNetPrefabs)
+ {
+ m_didProcessNetPrefabs = didProcessNetPrefabs;
+ }
MultiplayerToolsModule::MultiplayerToolsModule()
: AZ::Module()
diff --git a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h
index 823bd63a1d..82d0415c5a 100644
--- a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h
+++ b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h
@@ -12,10 +12,37 @@
#pragma once
+#include
#include
+#include
namespace Multiplayer
{
+ class MultiplayerToolsSystemComponent final
+ : public AZ::Component
+ , public IMultiplayerTools
+ {
+ public:
+ AZ_COMPONENT(MultiplayerToolsSystemComponent, "{65AF5342-0ECE-423B-B646-AF55A122F72B}");
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ MultiplayerToolsSystemComponent() = default;
+ ~MultiplayerToolsSystemComponent() override = default;
+
+ /// AZ::Component overrides.
+ void Activate() override {};
+
+ void Deactivate() override {};
+
+ bool DidProcessNetworkPrefabs() override;
+
+ private:
+ void SetDidProcessNetworkPrefabs(bool didProcessNetPrefabs) override;
+
+ bool m_didProcessNetPrefabs = false;
+ };
+
class MultiplayerToolsModule
: public AZ::Module
{
diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp
index 2006272135..8528b3d564 100644
--- a/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp
+++ b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp
@@ -18,6 +18,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -29,6 +30,8 @@ namespace Multiplayer
void NetworkPrefabProcessor::Process(PrefabProcessorContext& context)
{
+ IMultiplayerTools* mpTools = AZ::Interface::Get();
+ mpTools->SetDidProcessNetworkPrefabs(false);
context.ListPrefabs([&context](AZStd::string_view prefabName, PrefabDom& prefab) {
ProcessPrefab(context, prefabName, prefab);
});
diff --git a/Gems/Multiplayer/Code/multiplayer_tools_files.cmake b/Gems/Multiplayer/Code/multiplayer_tools_files.cmake
index 1be02fd999..12f12479ba 100644
--- a/Gems/Multiplayer/Code/multiplayer_tools_files.cmake
+++ b/Gems/Multiplayer/Code/multiplayer_tools_files.cmake
@@ -10,6 +10,7 @@
#
set(FILES
+ Include/IMultiplayerTools.h
Source/Multiplayer_precompiled.cpp
Source/Multiplayer_precompiled.h
Source/Pipeline/NetworkPrefabProcessor.cpp
From f5414050e36906541cad6fcf1377918f602ecae6 Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 00:37:53 -0700
Subject: [PATCH 006/142] smoke test cases migration
---
.../Gem/PythonTests/CMakeLists.txt | 15 ++
.../smoke/Editor_NewExistingLevels.py | 155 ++++++++++++++++++
.../Gem/PythonTests/smoke/ImportPathHelper.py | 16 ++
.../Gem/PythonTests/smoke/__init__.py | 10 ++
.../PythonTests/smoke/test_AssetBuilder.py | 44 +++++
.../smoke/test_AssetProcessorBatch.py | 43 +++++
.../PythonTests/smoke/test_AzTestRunner.py | 46 ++++++
.../smoke/test_Editor_NewExistingLevels.py | 34 ++++
.../smoke/test_PythonBindingsExample.py | 45 +++++
.../smoke/test_SerializeContextTools.py | 44 +++++
.../smoke/test_Statictool_Scripts.py | 48 ++++++
11 files changed, 500 insertions(+)
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/__init__.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 6d3727195e..26c425fd79 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -307,3 +307,18 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
#)
endif()
+## Smoke ##
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::SmokeTest_Periodic
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/smoke
+ TIMEOUT 3600
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ AZ::PythonBindingsExample
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py b/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py
new file mode 100644
index 0000000000..4e4a037ec9
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py
@@ -0,0 +1,155 @@
+"""
+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.
+
+
+Test case ID: LY-123945
+Test Case Title: Create Test for UI apps- Editor
+URL of the test case: https://jira.agscollab.com/browse/LY-123945
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("Level created", "Failed to create level")
+ entity_found = ("New Entity created in level", "Failed to create New Entity in level")
+ mesh_added = ("Mesh Component added", "Failed to add Mesh Component")
+ enter_game_mode = ("Game Mode successfully entered", "Failed to enter in Game Mode")
+ exit_game_mode = ("Game Mode successfully exited", "Failed to exit in Game Mode")
+ level_opened = ("Level opened successfully", "Failed to open level")
+ level_exported = ("Level exported successfully", "Failed to export level")
+ mesh_removed = ("Mesh Component removed", "Failed to remove Mesh Component")
+ entity_deleted = ("Entity deleted", "Failed to delete Entity")
+ level_edits_present = ("Level edits persist after saving", "Failed to save level edits after saving")
+# fmt: on
+
+
+def Editor_NewExistingLevels():
+ """
+ Summary: Perform the below operations on Editor
+
+ 1) Launch & Close editor
+ 2) Create new level
+ 3) Saving and loading levels
+ 4) Level edits persist after saving
+ 5) Export Level
+ 6) Can switch to play mode (ctrl+g) and exit that
+ 7) Run editor python bindings test
+ 8) Create an Entity
+ 9) Delete an Entity
+ 10) Add a component to an Entity
+
+ Expected Behavior:
+ All operations succeed and do not cause a crash
+
+ Test Steps:
+ 1) Launch editor and Create a new level
+ 2) Create a new entity
+ 3) Add Mesh component
+ 4) Verify enter/exit game mode
+ 5) Save, Load and Export level
+ 6) Remove Mesh component
+ 7) Delete entity
+ 8) Open an existing level
+ 9) Create a new entity in an existing level
+ 10) Save, Load and Export an existing level and close editor
+
+ Note:
+ - This test file must be called from the Lumberyard 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 os
+ import hydra_editor_utils as hydra
+ from utils import TestHelper as helper
+ from utils import Report
+ import azlmbr.bus as bus
+ import azlmbr.editor as editor
+ import azlmbr.legacy.general as general
+ import azlmbr.math as math
+
+ # 1) Launch editor and Create a new level
+ helper.init_idle()
+ test_level_name = "temp_level"
+ general.create_level_no_prompt(test_level_name, 128, 1, 128, False)
+ general.idle_wait(2.0)
+ Report.result(Tests.level_created, general.get_current_level_name() == test_level_name)
+
+ # 2) Create a new entity
+ entity_position = math.Vector3(200.0, 200.0, 38.0)
+ new_entity = hydra.Entity("Entity1")
+ new_entity.create_entity(entity_position, [])
+ test_entity = hydra.find_entity_by_name("Entity1")
+ Report.result(Tests.entity_found, test_entity.IsValid())
+
+ # 3) Add Mesh component
+ new_entity.add_component("Mesh")
+ Report.result(Tests.mesh_added, hydra.has_components(new_entity.id, ["Mesh"]))
+
+ # 4) Verify enter/exit game mode
+ helper.enter_game_mode(Tests.enter_game_mode)
+ helper.exit_game_mode(Tests.exit_game_mode)
+
+ # 5) Save, Load and Export level
+ # Save Level
+ general.save_level()
+ # Open Level
+ general.open_level(test_level_name)
+ Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
+ # Export Level
+ general.idle_wait(1.0)
+ general.export_to_engine()
+ level_pak_file = os.path.join("AutomatedTesting", "Levels", test_level_name, "level.pak")
+ Report.result(Tests.level_exported, os.path.exists(level_pak_file))
+
+ # 6) Remove Mesh component
+ new_entity.remove_component("Mesh")
+ Report.result(Tests.mesh_removed, not hydra.has_components(new_entity.id, ["Mesh"]))
+
+ # 7) Delete entity
+ editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", new_entity.id)
+ test_entity = hydra.find_entity_by_name("Entity1")
+ Report.result(Tests.entity_deleted, len(test_entity) == 0)
+
+ # 8) Open an existing level
+ general.open_level(test_level_name)
+ Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
+
+ # 9) Create a new entity in an existing level
+ entity_position = math.Vector3(200.0, 200.0, 38.0)
+ new_entity_2 = hydra.Entity("Entity2")
+ new_entity_2.create_entity(entity_position, [])
+ test_entity = hydra.find_entity_by_name("Entity2")
+ Report.result(Tests.entity_found, test_entity.IsValid())
+
+ # 10) Save, Load and Export an existing level
+ # Save Level
+ general.save_level()
+ # Open Level
+ general.open_level(test_level_name)
+ Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
+ entity_id = hydra.find_entity_by_name(new_entity_2.name)
+ Report.result(Tests.level_edits_present, entity_id == new_entity_2.id)
+ # Export Level
+ general.export_to_engine()
+ level_pak_file = os.path.join("AutomatedTesting", "Levels", test_level_name, "level.pak")
+ Report.result(Tests.level_exported, os.path.exists(level_pak_file))
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+
+ from utils import Report
+
+ Report.start_test(Editor_NewExistingLevels)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py
new file mode 100644
index 0000000000..70bed6e526
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py
@@ -0,0 +1,16 @@
+"""
+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.
+"""
+
+def init():
+ import os
+ import sys
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../EditorPythonTestTools/editor_python_test_tools')
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
new file mode 100644
index 0000000000..6ed3dc4bda
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
@@ -0,0 +1,10 @@
+"""
+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.
+"""
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py b/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py
new file mode 100644
index 0000000000..da2abff50f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py
@@ -0,0 +1,44 @@
+"""
+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.
+"""
+
+"""
+LY-124059 : CLI tool - AssetBuilder
+Launch AssetBuilder and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import ly_test_tools.environment.process_utils as process_utils
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestAssetBuilder(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ def teardown():
+ process_utils.kill_processes_named("AssetBuilder", True)
+
+ request.addfinalizer(teardown)
+
+ @pytest.mark.test_case_id("LY-124059")
+ def test_AssetBuilder(self, request, editor, build_directory):
+ file_path = os.path.join(build_directory, "AssetBuilder")
+ help_message = "AssetBuilder is part of the Asset Processor"
+ # Launch AssetBuilder
+ output = subprocess.run([file_path, "-help"], capture_output=True)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py b/AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py
new file mode 100644
index 0000000000..ab541b94c1
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py
@@ -0,0 +1,43 @@
+"""
+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.
+"""
+
+"""
+LY-124061 : CLI tool - AssetProcessorBatch
+Launch AssetProcessorBatch and Shutdown AssetProcessorBatch without any crash
+"""
+
+
+# Import builtin libraries
+import pytest
+import os
+import sys
+
+sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../assetpipeline/")
+
+# Import fixtures
+from ap_fixtures.asset_processor_fixture import asset_processor as asset_processor
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.usefixtures("asset_processor")
+@pytest.mark.SUITE_smoke
+class TestsAssetProcessorBatchs(object):
+ @pytest.mark.test_case_id("LY-124061")
+ def test_AssetProcessorBatch(self, asset_processor):
+ """
+ Test Launching AssetProcessorBatch and verifies that is shuts down without issue
+ """
+ # Create a sample asset root so we don't process every asset for every platform
+ asset_processor.create_temp_asset_root()
+ # Launch AssetProcessorBatch, assert batch processing success
+ result, _ = asset_processor.batch_process()
+ assert result, "AP Batch failed"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py b/AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py
new file mode 100644
index 0000000000..d1bc44fe2f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py
@@ -0,0 +1,46 @@
+"""
+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.
+"""
+
+"""
+LY-124062 : CLI tool - AzTestRunner
+Launch AzTestRunner and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import ly_test_tools.environment.process_utils as process_utils
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestAzTestRunner(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ def teardown():
+ process_utils.kill_processes_named("AzTestRunner", True)
+
+ request.addfinalizer(teardown)
+
+ @pytest.mark.test_case_id("LY-124062")
+ def test_AzTestRunner(self, request, editor, build_directory):
+ file_path = os.path.join(build_directory, "AzTestRunner")
+ help_message = "OKAY Symbol found: AzRunUnitTests"
+ # Launch AzTestRunner
+ output = subprocess.run(
+ [file_path, "AzTestRunner.Tests", "AzRunUnitTests", "--gtest_list_tests"], capture_output=True
+ )
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py
new file mode 100644
index 0000000000..85d53d098d
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py
@@ -0,0 +1,34 @@
+"""
+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.
+"""
+
+import pytest
+import os
+import sys
+
+sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../automatedtesting_shared")
+
+from automatedtesting_shared.base import TestAutomationBase
+import ly_test_tools.environment.file_system as file_system
+
+
+@pytest.mark.SUITE_smoke
+@pytest.mark.parametrize("launcher_platform", ["windows_editor"])
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.parametrize("level", ["temp_level"])
+class TestAutomation(TestAutomationBase):
+ def test_Editor_NewExistingLevels(self, request, workspace, editor, level, project, launcher_platform):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+
+ from . import Editor_NewExistingLevels as test_module
+ self._run_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py b/AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py
new file mode 100644
index 0000000000..140e76fc96
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py
@@ -0,0 +1,45 @@
+"""
+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.
+"""
+
+"""
+LY-124064 : CLI tool - PythonBindingsExample
+Launch PythonBindingsExample and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import ly_test_tools.environment.process_utils as process_utils
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestPythonBindingsExample(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ def teardown():
+ process_utils.kill_processes_named("PythonBindingsExample", True)
+
+ request.addfinalizer(teardown)
+
+ @pytest.mark.test_case_id("LY-124064")
+ def test_PythonBindingsExample(self, request, editor, build_directory):
+ file_path = os.path.join(build_directory, "PythonBindingsExample")
+ help_message = "--help Prints the help text"
+ # Launch PythonBindingsExample
+ output = subprocess.run([file_path, "-help"], capture_output=True)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 1
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
+
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py b/AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py
new file mode 100644
index 0000000000..763d84625d
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py
@@ -0,0 +1,44 @@
+"""
+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.
+"""
+
+"""
+LY-124066 : CLI tool - SerializeContextTools
+Launch SerializeContextTools and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import ly_test_tools.environment.process_utils as process_utils
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestSerializeContextTools(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ def teardown():
+ process_utils.kill_processes_named("SerializeContextTools", True)
+
+ request.addfinalizer(teardown)
+
+ @pytest.mark.test_case_id("LY-124066")
+ def test_SerializeContextTools(self, request, editor, build_directory):
+ file_path = os.path.join(build_directory, "SerializeContextTools")
+ help_message = "Converts a file with an ObjectStream to the new JSON"
+ # Launch SerializeContextTools
+ output = subprocess.run([file_path, "-help"], capture_output=True)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
new file mode 100644
index 0000000000..d1ae1d4ee0
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
@@ -0,0 +1,48 @@
+"""
+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.
+"""
+
+"""
+LY-124058: Static tool scripts
+Launch Static tool and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import sys
+
+
+def verify_help_message(static_tool):
+ help_message = ["--help", "show this help message and exit"]
+ output = subprocess.run([sys.executable, static_tool, "-h"], capture_output=True)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {static_tool}: {output.stderr}"
+ # verify help message
+ for message in help_message:
+ assert message in str(output.stdout), f"Help Message: {message} is not present"
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestStatictoolScripts(object):
+ @pytest.mark.test_case_id("LY-124058")
+ def test_Statictool_Scripts(self, request, editor):
+ static_tools = [
+ os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "gen_shaders.py"),
+ os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "get_shader_list.py"),
+ os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "pak_shaders.py"),
+ ]
+
+ for tool in static_tools:
+ verify_help_message(tool)
+
\ No newline at end of file
From 4ce7e117a9347e5dc2fc8204bc8ffd6d44530920 Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 00:51:06 -0700
Subject: [PATCH 007/142] "Updating cmakelist.txt to remove extra intendation"
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 4 ++--
.../Gem/PythonTests/smoke/test_Statictool_Scripts.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 26c425fd79..e6fff224d3 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -316,9 +316,9 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
PATH ${CMAKE_CURRENT_LIST_DIR}/smoke
TIMEOUT 3600
RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
+ AZ::AssetProcessor
AZ::PythonBindingsExample
Legacy::Editor
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
-
+
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
index d1ae1d4ee0..86f5d67478 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
@@ -45,4 +45,4 @@ class TestStatictoolScripts(object):
for tool in static_tools:
verify_help_message(tool)
-
\ No newline at end of file
+
\ No newline at end of file
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 008/142] 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 0e666d046c37a305fa89bb335f7bc43bd4a89356 Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 00:57:51 -0700
Subject: [PATCH 009/142] "Adding new line"
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 1 +
AutomatedTesting/Gem/PythonTests/smoke/__init__.py | 2 +-
.../Gem/PythonTests/smoke/test_Statictool_Scripts.py | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index e6fff224d3..8dfac40c43 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -321,4 +321,5 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
Legacy::Editor
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
+
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
index 6ed3dc4bda..79f8fa4422 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
@@ -7,4 +7,4 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
\ No newline at end of file
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
index 86f5d67478..92be4abeb9 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
@@ -45,4 +45,5 @@ class TestStatictoolScripts(object):
for tool in static_tools:
verify_help_message(tool)
+
\ No newline at end of file
From 2f153f994e2b5be015f661bf81d99e96c3947bab Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 01:12:38 -0700
Subject: [PATCH 010/142] "Adding new line"
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 1 -
AutomatedTesting/Gem/PythonTests/smoke/__init__.py | 2 +-
.../Gem/PythonTests/smoke/test_Statictool_Scripts.py | 2 --
3 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 8dfac40c43..e6fff224d3 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -321,5 +321,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
Legacy::Editor
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
-
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
index 79f8fa4422..6ed3dc4bda 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
@@ -7,4 +7,4 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
+"""
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
index 92be4abeb9..8eac2ff099 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
@@ -45,5 +45,3 @@ class TestStatictoolScripts(object):
for tool in static_tools:
verify_help_message(tool)
-
-
\ No newline at end of file
From 2f0ed6cfb21aac2b99b6b5f303286bccba3ea814 Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 01:17:20 -0700
Subject: [PATCH 011/142] ""
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 1 -
AutomatedTesting/Gem/PythonTests/smoke/__init__.py | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index e6fff224d3..400dca33ce 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -321,4 +321,3 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
Legacy::Editor
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
-
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
index 6ed3dc4bda..79f8fa4422 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
@@ -7,4 +7,4 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
\ No newline at end of file
+"""
From 682bdf684743ddc094cf32ab02a5246b63191eef Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 08:50:34 -0700
Subject: [PATCH 012/142] "Changing testsuite"
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 400dca33ce..92dcc7dc7f 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -310,8 +310,8 @@ endif()
## Smoke ##
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
ly_add_pytest(
- NAME AutomatedTesting::SmokeTest_Periodic
- TEST_SUITE periodic
+ NAME AutomatedTesting::SmokeTest
+ TEST_SUITE smoke
TEST_SERIAL
PATH ${CMAKE_CURRENT_LIST_DIR}/smoke
TIMEOUT 3600
From 2b511b68a2538326b199a088d7a4d4cfa94581c4 Mon Sep 17 00:00:00 2001
From: darapan
Date: Wed, 5 May 2021 10:26:11 -0700
Subject: [PATCH 013/142] "Adding AssetBundlerBatch test"
---
.../smoke/test_AssetBundlerBatch.py | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py b/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py
new file mode 100644
index 0000000000..d361c62f5f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py
@@ -0,0 +1,44 @@
+"""
+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.
+"""
+
+"""
+LY-124060 : CLI tool - AssetBundlerBatch
+Launch AssetBundlerBatch and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import ly_test_tools.environment.process_utils as process_utils
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestAssetBundlerBatch(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ def teardown():
+ process_utils.kill_processes_named("AssetBundlerBatch", True)
+
+ request.addfinalizer(teardown)
+
+ @pytest.mark.test_case_id("LY-124060")
+ def test_AssetBundlerBatch(self, request, editor, build_directory):
+ file_path = os.path.join(build_directory, "AssetBundlerBatch")
+ help_message = "Specifies the Seed List file to operate on by path"
+ # Launch AssetBundlerBatch
+ output = subprocess.run([file_path, "--help"], capture_output=True)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
From aa51233536a55816324da9d41fff6afe4e3970c9 Mon Sep 17 00:00:00 2001
From: puvvadar
Date: Thu, 6 May 2021 16:18:13 -0700
Subject: [PATCH 014/142] Add Asset serialization for Ctrl+G and related net
interfaces
---
.../AzNetworking/TcpTransport/TcpSocket.cpp | 4 +-
.../AutoGen/Multiplayer.AutoPackets.xml | 6 ++
.../MultiplayerEditorSystemComponent.cpp | 93 +++++++++++++++++--
.../Editor/MultiplayerEditorSystemComponent.h | 2 +
.../Source/MultiplayerSystemComponent.cpp | 21 +++++
.../Code/Source/MultiplayerSystemComponent.h | 4 +-
.../Code/Source/MultiplayerToolsModule.cpp | 10 ++
.../Code/Source/MultiplayerToolsModule.h | 5 +-
8 files changed, 132 insertions(+), 13 deletions(-)
diff --git a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp
index 78020cb09d..e8c30d0816 100644
--- a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp
+++ b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp
@@ -116,8 +116,8 @@ namespace AzNetworking
int32_t TcpSocket::Receive(uint8_t* outData, uint32_t size) const
{
- AZ_Assert(size > 0, "Invalid data size for send");
- AZ_Assert(outData != nullptr, "NULL data pointer passed to send");
+ AZ_Assert(size > 0, "Invalid data size for receive");
+ AZ_Assert(outData != nullptr, "NULL data pointer passed to receive");
if (!IsOpen())
{
return SocketOpResultErrorNotOpen;
diff --git a/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml b/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml
index 5de466899c..21faefa880 100644
--- a/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml
+++ b/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml
@@ -57,4 +57,10 @@
+
+
+
+
+
+
diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp
index 0850b858a2..15f00bdf80 100644
--- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp
+++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp
@@ -10,23 +10,32 @@
*
*/
+#include
#include
+#include
+#include
#include
#include
+#include
#include
#include
#include
#include
+#include
#include
namespace Multiplayer
{
+ static const AZStd::string_view s_networkInterfaceName("MultiplayerEditorServerInterface");
+
using namespace AzNetworking;
AZ_CVAR(bool, editorsv_enabled, false, nullptr, AZ::ConsoleFunctorFlags::DontReplicate,
"Whether Editor launching a local server to connect to is supported");
AZ_CVAR(AZ::CVarFixedString, editorsv_process, "", nullptr, AZ::ConsoleFunctorFlags::DontReplicate,
"The server executable that should be run. Empty to use the current project's ServerLauncher");
+ AZ_CVAR(AZ::CVarFixedString, sv_serveraddr, "127.0.0.1", nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "The address of the server to connect to");
+ AZ_CVAR(uint16_t, sv_port, 30091, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "The port that the multiplayer editor gem will bind to for traffic");
void MultiplayerEditorSystemComponent::Reflect(AZ::ReflectContext* context)
{
@@ -61,6 +70,16 @@ namespace Multiplayer
{
AzFramework::GameEntityContextEventBus::Handler::BusConnect();
AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
+
+ // Setup a network interface handled by MultiplayerSystemComponent
+ if (m_editorNetworkInterface == nullptr)
+ {
+ AZ::Entity* systemEntity = this->GetEntity();
+ MultiplayerSystemComponent* mpSysComponent = systemEntity->FindComponent();
+
+ m_editorNetworkInterface = AZ::Interface::Get()->CreateNetworkInterface(
+ AZ::Name(s_networkInterfaceName), ProtocolType::Tcp, TrustZone::ExternalClientToServer, *mpSysComponent);
+ }
}
void MultiplayerEditorSystemComponent::Deactivate()
@@ -97,25 +116,52 @@ namespace Multiplayer
m_serverProcess->TerminateProcess(0);
m_serverProcess = nullptr;
}
+ if (m_editorNetworkInterface)
+ {
+ // Disconnect the interface, connection management will clean it up
+ m_editorNetworkInterface->Disconnect(m_editorConnId, AzNetworking::DisconnectReason::TerminatedByUser);
+ m_editorConnId = AzNetworking::InvalidConnectionId;
+ }
break;
}
}
void MultiplayerEditorSystemComponent::OnGameEntitiesStarted()
{
+ auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get();
+ if (!prefabEditorEntityOwnershipInterface)
+ {
+ AZ_Error("MultiplayerEditor", prefabEditorEntityOwnershipInterface != nullptr, "PrefabEditorEntityOwnershipInterface unavailable");
+ }
+ const AZStd::vector>& assetData = prefabEditorEntityOwnershipInterface->GetPlayInEditorAssetData();
+
+ AZStd::vector buffer;
+ AZ::IO::ByteContainerStream byteStream(&buffer);
+
+ // Serialize Asset information and AssetData into a potentially large buffer
+ for (auto asset : assetData)
+ {
+ AZ::Data::AssetId assetId = asset.GetId();
+ AZ::Data::AssetType assetType = asset.GetType();
+ const AZStd::string& assetHint = asset.GetHint();
+ AZ::IO::SizeType assetHintSize = assetHint.size();
+ AZ::Data::AssetLoadBehavior assetLoadBehavior = asset.GetAutoLoadBehavior();
+
+ byteStream.Write(sizeof(AZ::Data::AssetId), reinterpret_cast(&assetId));
+ byteStream.Write(sizeof(AZ::Data::AssetType), reinterpret_cast(&assetType));
+ byteStream.Write(sizeof(assetHintSize), reinterpret_cast(&assetHintSize));
+ byteStream.Write(assetHint.size(), assetHint.c_str());
+ byteStream.Write(sizeof(AZ::Data::AssetLoadBehavior), reinterpret_cast(&assetLoadBehavior));
+
+ AZ::Utils::SaveObjectToStream(byteStream, AZ::DataStream::ST_BINARY, asset.GetData(), asset.GetData()->GetType());
+ }
+
// BeginGameMode and Prefab Processing have completed at this point
IMultiplayerTools* mpTools = AZ::Interface::Get();
if (editorsv_enabled && mpTools != nullptr && mpTools->DidProcessNetworkPrefabs())
{
AZ::TickBus::Handler::BusConnect();
- auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get();
- if (!prefabEditorEntityOwnershipInterface)
- {
- AZ_Error("MultiplayerEditor", prefabEditorEntityOwnershipInterface != nullptr, "PrefabEditorEntityOwnershipInterface unavailable");
- }
- const AZStd::vector>& assetData = prefabEditorEntityOwnershipInterface->GetPlayInEditorAssetData();
-
if (assetData.size() > 0)
{
// Assemble the server's path
@@ -154,6 +200,39 @@ namespace Multiplayer
processLaunchInfo, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_NONE);
}
}
+
+ // Now that the server has launched, attempt to connect the NetworkInterface
+ const AZ::CVarFixedString remoteAddress = sv_serveraddr;
+ m_editorConnId = m_editorNetworkInterface->Connect(
+ AzNetworking::IpAddress(remoteAddress.c_str(), sv_port, AzNetworking::ProtocolType::Tcp));
+
+ // Read the buffer into EditorServerInit packets until we've flushed the whole thing
+ byteStream.Seek(0, AZ::IO::GenericStream::SeekMode::ST_SEEK_BEGIN);
+
+ while (byteStream.GetCurPos() < byteStream.GetLength())
+ {
+ MultiplayerPackets::EditorServerInit packet;
+ AzNetworking::TcpPacketEncodingBuffer& outBuffer = packet.ModifyAssetData();
+
+ // Size the packet's buffer appropriately
+ size_t readSize = TcpPacketEncodingBuffer::GetCapacity();
+ size_t byteStreamSize = byteStream.GetLength() - byteStream.GetCurPos();
+ if (byteStreamSize < readSize)
+ {
+ readSize = byteStreamSize;
+ }
+
+ outBuffer.Resize(readSize);
+ byteStream.Read(readSize, outBuffer.GetBuffer());
+
+ // If we've run out of buffer, mark that we're done
+ if (byteStream.GetCurPos() == byteStream.GetLength())
+ {
+ packet.SetLastUpdate(true);
+ }
+ m_editorNetworkInterface->SendReliablePacket(m_editorConnId, packet);
+ }
+
}
void MultiplayerEditorSystemComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h
index 31ecdf83a3..d43d8747b9 100644
--- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h
+++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.h
@@ -81,5 +81,7 @@ namespace Multiplayer
IEditor* m_editor = nullptr;
AzFramework::ProcessWatcher* m_serverProcess = nullptr;
+ AzNetworking::ConnectionId m_editorConnId;
+ AzNetworking::INetworkInterface* m_editorNetworkInterface = nullptr;
};
}
diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp
index 03c661ab03..3c1e142d96 100644
--- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp
+++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp
@@ -57,7 +57,9 @@ namespace Multiplayer
using namespace AzNetworking;
static const AZStd::string_view s_networkInterfaceName("MultiplayerNetworkInterface");
+ static const AZStd::string_view s_networkEditorInterfaceName("MultiplayerEditorNetworkInterface");
static constexpr uint16_t DefaultServerPort = 30090;
+ static constexpr uint16_t DefaultServerEditorPort = 30091;
AZ_CVAR(uint16_t, cl_clientport, 0, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "The port to bind to for game traffic when connecting to a remote host, a value of 0 will select any available port");
AZ_CVAR(AZ::CVarFixedString, cl_serveraddr, "127.0.0.1", nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "The address of the remote server or host to connect to");
@@ -397,6 +399,19 @@ namespace Multiplayer
return false;
}
+ bool MultiplayerSystemComponent::HandleRequest
+ (
+ [[maybe_unused]] AzNetworking::IConnection* connection,
+ [[maybe_unused]] const IPacketHeader& packetHeader,
+ [[maybe_unused]] MultiplayerPackets::EditorServerInit& packet
+ )
+ {
+#if !defined(_RELEASE)
+ // Support Editor Server Init for all non-release targets
+#endif
+ return true;
+ }
+
ConnectResult MultiplayerSystemComponent::ValidateConnect
(
[[maybe_unused]] const IpAddress& remoteAddress,
@@ -492,6 +507,12 @@ namespace Multiplayer
{
if (multiplayerType == MultiplayerAgentType::ClientServer || multiplayerType == MultiplayerAgentType::DedicatedServer)
{
+#if !defined(_RELEASE)
+ m_networkEditorInterface = AZ::Interface::Get()->CreateNetworkInterface(
+ AZ::Name(s_networkEditorInterfaceName), ProtocolType::Tcp, TrustZone::ExternalClientToServer, *this);
+ m_networkEditorInterface->Listen(DefaultServerEditorPort);
+#endif
+
m_initEvent.Signal(m_networkInterface);
const AZ::Aabb worldBounds = AZ::Aabb::CreateFromMinMax(AZ::Vector3(-16384.0f), AZ::Vector3(16384.0f));
diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h
index f25e530b61..e77fa129b0 100644
--- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h
+++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h
@@ -72,7 +72,8 @@ namespace Multiplayer
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::NotifyClientMigration& packet);
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::EntityMigration& packet);
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::ReadyForEntityUpdates& packet);
-
+ bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::EditorServerInit& packet);
+
//! IConnectionListener interface
//! @{
AzNetworking::ConnectResult ValidateConnect(const AzNetworking::IpAddress& remoteAddress, const AzNetworking::IPacketHeader& packetHeader, AzNetworking::ISerializer& serializer) override;
@@ -109,6 +110,7 @@ namespace Multiplayer
AZ_CONSOLEFUNC(MultiplayerSystemComponent, DumpStats, AZ::ConsoleFunctorFlags::Null, "Dumps stats for the current multiplayer session");
AzNetworking::INetworkInterface* m_networkInterface = nullptr;
+ AzNetworking::INetworkInterface* m_networkEditorInterface = nullptr;
AZ::ConsoleCommandInvokedEvent::Handler m_consoleCommandHandler;
AZ::ThreadSafeDeque m_cvarCommands;
diff --git a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp
index a5df3c1dc5..ae91999a0c 100644
--- a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp
+++ b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp
@@ -24,6 +24,16 @@ namespace Multiplayer
NetworkPrefabProcessor::Reflect(context);
}
+ void MultiplayerToolsSystemComponent::Activate()
+ {
+ AZ::Interface::Register(this);
+ }
+
+ void MultiplayerToolsSystemComponent::Deactivate()
+ {
+ AZ::Interface::Unregister(this);
+ }
+
bool MultiplayerToolsSystemComponent::DidProcessNetworkPrefabs()
{
return m_didProcessNetPrefabs;
diff --git a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h
index 82d0415c5a..181a971150 100644
--- a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h
+++ b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h
@@ -31,9 +31,8 @@ namespace Multiplayer
~MultiplayerToolsSystemComponent() override = default;
/// AZ::Component overrides.
- void Activate() override {};
-
- void Deactivate() override {};
+ void Activate() override;
+ void Deactivate() override;
bool DidProcessNetworkPrefabs() override;
From 1f3d0beb387a68ac5ac87c63aafa5105d1f253b6 Mon Sep 17 00:00:00 2001
From: antonmic
Date: Fri, 7 May 2021 18:51:20 -0700
Subject: [PATCH 015/142] work in progress
---
.../Materials/Types/StandardPBR.materialtype | 15 +
.../Types/StandardPBR_ForwardPass.azsl | 15 +-
.../Types/StandardPBR_LowEndForward.azsl | 15 +
.../Types/StandardPBR_LowEndForward.shader | 53 +++
.../StandardPBR_LowEndForward_EDS.shader | 53 +++
.../Feature/Common/Assets/Passes/Forward.pass | 16 -
.../Assets/Passes/LightAdaptationParent.pass | 146 ++++++++
.../Common/Assets/Passes/LowEndForward.pass | 133 +++++++
.../Common/Assets/Passes/LowEndPipeline.pass | 344 ++++++++++++++++++
.../Common/Assets/Passes/OpaqueParent.pass | 11 +-
.../Assets/Passes/PassTemplates.azasset | 12 +
.../Assets/Passes/PostProcessParent.pass | 90 +----
.../Feature/Common/Assets/Passes/SkyBox.pass | 5 -
.../Atom/Features/PBR/ForwardPassOutput.azsli | 17 +
.../PBR/LowEndForwardPassOutput.azsli | 32 ++
.../Atom/Features/ShaderQualityOptions.azsli | 24 ++
.../Reflections/ReflectionComposite.azsl | 15 +-
.../Common/Assets/Shaders/SkyBox/SkyBox.azsl | 2 -
.../atom_feature_common_asset_files.cmake | 10 +
19 files changed, 887 insertions(+), 121 deletions(-)
create mode 100644 Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl
create mode 100644 Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.shader
create mode 100644 Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward_EDS.shader
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/LightAdaptationParent.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/LowEndForward.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/LowEndPipeline.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
index e071a793a5..fa5c94c606 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
@@ -77,6 +77,13 @@
],
"properties": {
"general": [
+ {
+ "id": "useLowEndShader",
+ "displayName": "Use Low End",
+ "description": "Whether to use the low end shader.",
+ "type": "Bool",
+ "defaultValue": false
+ },
{
"id": "applySpecularAA",
"displayName": "Apply Specular AA",
@@ -1175,6 +1182,14 @@
"file": "./StandardPBR_ForwardPass_EDS.shader",
"tag": "ForwardPass_EDS"
},
+ {
+ "file": "./StandardPBR_LowEndForward.shader",
+ "tag": "LowEndForward"
+ },
+ {
+ "file": "./StandardPBR_LowEndForward_EDS.shader",
+ "tag": "LowEndForward_EDS"
+ },
{
"file": "Shaders/Shadow/Shadowmap.shader",
"tag": "Shadowmap"
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl
index d3bc72d162..bb4e4cdaab 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl
@@ -10,6 +10,8 @@
*
*/
+#include "Atom/Features/ShaderQualityOptions.azsli"
+
#include "StandardPBR_Common.azsli"
// SRGs
@@ -306,13 +308,18 @@ ForwardPassOutputWithDepth StandardPbr_ForwardPassPS(VSOutput IN, bool isFrontFa
PbrLightingOutput lightingOutput = ForwardPassPS_Common(IN, isFrontFace, depth);
+#ifdef UNIFIED_FORWARD_OUTPUT
+ OUT.m_color.rgb = lightingOutput.m_diffuseColor.rgb + lightingOutput.m_specularColor.rgb;
+ OUT.m_color.a = 1.0f;
+ OUT.m_depth = depth;
+#else
OUT.m_diffuseColor = lightingOutput.m_diffuseColor;
OUT.m_specularColor = lightingOutput.m_specularColor;
OUT.m_specularF0 = lightingOutput.m_specularF0;
OUT.m_albedo = lightingOutput.m_albedo;
OUT.m_normal = lightingOutput.m_normal;
OUT.m_depth = depth;
-
+#endif
return OUT;
}
@@ -324,12 +331,16 @@ ForwardPassOutput StandardPbr_ForwardPassPS_EDS(VSOutput IN, bool isFrontFace :
PbrLightingOutput lightingOutput = ForwardPassPS_Common(IN, isFrontFace, depth);
+#ifdef UNIFIED_FORWARD_OUTPUT
+ OUT.m_color.rgb = lightingOutput.m_diffuseColor.rgb + lightingOutput.m_specularColor.rgb;
+ OUT.m_color.a = 1.0f;
+#else
OUT.m_diffuseColor = lightingOutput.m_diffuseColor;
OUT.m_specularColor = lightingOutput.m_specularColor;
OUT.m_specularF0 = lightingOutput.m_specularF0;
OUT.m_albedo = lightingOutput.m_albedo;
OUT.m_normal = lightingOutput.m_normal;
-
+#endif
return OUT;
}
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl
new file mode 100644
index 0000000000..a690cbf84a
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl
@@ -0,0 +1,15 @@
+/*
+* 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.
+*
+*/
+
+#define QUALITY_LOW_END 1
+
+#include "StandardPBR_ForwardPass.azsl"
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.shader
new file mode 100644
index 0000000000..19538e5db3
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.shader
@@ -0,0 +1,53 @@
+{
+ "Source" : "./StandardPBR_LowEndForward.azsl",
+
+ "DepthStencilState" :
+ {
+ "Depth" :
+ {
+ "Enable" : true,
+ "CompareFunc" : "GreaterEqual"
+ },
+ "Stencil" :
+ {
+ "Enable" : true,
+ "ReadMask" : "0x00",
+ "WriteMask" : "0xFF",
+ "FrontFace" :
+ {
+ "Func" : "Always",
+ "DepthFailOp" : "Keep",
+ "FailOp" : "Keep",
+ "PassOp" : "Replace"
+ },
+ "BackFace" :
+ {
+ "Func" : "Always",
+ "DepthFailOp" : "Keep",
+ "FailOp" : "Keep",
+ "PassOp" : "Replace"
+ }
+ }
+ },
+
+ "CompilerHints" : {
+ "DisableOptimizations" : false
+ },
+
+ "ProgramSettings":
+ {
+ "EntryPoints":
+ [
+ {
+ "name": "StandardPbr_ForwardPassVS",
+ "type": "Vertex"
+ },
+ {
+ "name": "StandardPbr_ForwardPassPS",
+ "type": "Fragment"
+ }
+ ]
+ },
+
+ "DrawList" : "lowEndForward"
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward_EDS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward_EDS.shader
new file mode 100644
index 0000000000..1b5f014d0e
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward_EDS.shader
@@ -0,0 +1,53 @@
+{
+ "Source" : "./StandardPBR_LowEndForward.azsl",
+
+ "DepthStencilState" :
+ {
+ "Depth" :
+ {
+ "Enable" : true,
+ "CompareFunc" : "GreaterEqual"
+ },
+ "Stencil" :
+ {
+ "Enable" : true,
+ "ReadMask" : "0x00",
+ "WriteMask" : "0xFF",
+ "FrontFace" :
+ {
+ "Func" : "Always",
+ "DepthFailOp" : "Keep",
+ "FailOp" : "Keep",
+ "PassOp" : "Replace"
+ },
+ "BackFace" :
+ {
+ "Func" : "Always",
+ "DepthFailOp" : "Keep",
+ "FailOp" : "Keep",
+ "PassOp" : "Replace"
+ }
+ }
+ },
+
+ "CompilerHints" : {
+ "DisableOptimizations" : false
+ },
+
+ "ProgramSettings":
+ {
+ "EntryPoints":
+ [
+ {
+ "name": "StandardPbr_ForwardPassVS",
+ "type": "Vertex"
+ },
+ {
+ "name": "StandardPbr_ForwardPassPS_EDS",
+ "type": "Fragment"
+ }
+ ]
+ },
+
+ "DrawList" : "lowEndForward"
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass b/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass
index 31a8ed1879..3dcc90ac5c 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass
@@ -148,22 +148,6 @@
},
"LoadAction": "Clear"
}
- },
- {
- "Name": "ScatterDistanceOutput",
- "SlotType": "Output",
- "ScopeAttachmentUsage": "RenderTarget",
- "LoadStoreAction": {
- "ClearValue": {
- "Value": [
- 0.0,
- 0.0,
- 0.0,
- 0.0
- ]
- },
- "LoadAction": "Clear"
- }
}
],
"ImageAttachments": [
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LightAdaptationParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/LightAdaptationParent.pass
new file mode 100644
index 0000000000..3e804d23e2
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/LightAdaptationParent.pass
@@ -0,0 +1,146 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData": {
+ "PassTemplate": {
+ "Name": "LightAdaptationParentTemplate",
+ "PassClass": "ParentPass",
+ "Slots": [
+ // Inputs...
+ {
+ "Name": "LightingInput",
+ "SlotType": "Input"
+ },
+ // SwapChain here is only used to reference the frame height and format
+ {
+ "Name": "SwapChainOutput",
+ "SlotType": "InputOutput"
+ },
+ // Outputs...
+ {
+ "Name": "Output",
+ "SlotType": "Output"
+ },
+ // Debug Outputs...
+ {
+ "Name": "LuminanceMipChainOutput",
+ "SlotType": "Output"
+ }
+ ],
+ "Connections": [
+ {
+ "LocalSlot": "Output",
+ "AttachmentRef": {
+ "Pass": "DisplayMapperPass",
+ "Attachment": "Output"
+ }
+ },
+ {
+ "LocalSlot": "LuminanceMipChainOutput",
+ "AttachmentRef": {
+ "Pass": "DownsampleLuminanceMipChain",
+ "Attachment": "MipChainInputOutput"
+ }
+ }
+ ],
+ "PassRequests": [
+ {
+ "Name": "DownsampleLuminanceMinAvgMax",
+ "TemplateName": "DownsampleLuminanceMinAvgMaxCS",
+ "Connections": [
+ {
+ "LocalSlot": "Input",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "LightingInput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "DownsampleLuminanceMipChain",
+ "TemplateName": "DownsampleMipChainTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "MipChainInputOutput",
+ "AttachmentRef": {
+ "Pass": "DownsampleLuminanceMinAvgMax",
+ "Attachment": "Output"
+ }
+ }
+ ],
+ "PassData": {
+ "$type": "DownsampleMipChainPassData",
+ "ShaderAsset": {
+ "FilePath": "Shaders/PostProcessing/DownsampleMinAvgMaxCS.shader"
+ }
+ }
+ },
+ {
+ "Name": "EyeAdaptationPass",
+ "TemplateName": "EyeAdaptationTemplate",
+ "Enabled": false,
+ "Connections": [
+ {
+ "LocalSlot": "SceneLuminanceInput",
+ "AttachmentRef": {
+ "Pass": "DownsampleLuminanceMipChain",
+ "Attachment": "MipChainInputOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "LookModificationTransformPass",
+ "TemplateName": "LookModificationTransformTemplate",
+ "Enabled": true,
+ "Connections": [
+ {
+ "LocalSlot": "Input",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "LightingInput"
+ }
+ },
+ {
+ "LocalSlot": "EyeAdaptationDataInput",
+ "AttachmentRef": {
+ "Pass": "EyeAdaptationPass",
+ "Attachment": "EyeAdaptationDataInputOutput"
+ }
+ },
+ {
+ "LocalSlot": "SwapChainOutput",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "DisplayMapperPass",
+ "TemplateName": "DisplayMapperTemplate",
+ "Enabled": true,
+ "Connections": [
+ {
+ "LocalSlot": "Input",
+ "AttachmentRef": {
+ "Pass": "LookModificationTransformPass",
+ "Attachment": "Output"
+ }
+ },
+ {
+ "LocalSlot": "SwapChainOutput",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LowEndForward.pass b/Gems/Atom/Feature/Common/Assets/Passes/LowEndForward.pass
new file mode 100644
index 0000000000..4b865fcb6d
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/LowEndForward.pass
@@ -0,0 +1,133 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData": {
+ "PassTemplate": {
+ "Name": "LowEndForwardPassTemplate",
+ "PassClass": "RasterPass",
+ "Slots": [
+ // Inputs...
+ {
+ "Name": "BRDFTextureInput",
+ "ShaderInputName": "m_brdfMap",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader"
+ },
+ {
+ "Name": "DirectionalLightShadowmap",
+ "ShaderInputName": "m_directionalLightShadowmap",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader",
+ "ImageViewDesc": {
+ "IsArray": 1
+ }
+ },
+ {
+ "Name": "ExponentialShadowmapDirectional",
+ "ShaderInputName": "m_directionalLightExponentialShadowmap",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader",
+ "ImageViewDesc": {
+ "IsArray": 1
+ }
+ },
+ {
+ "Name": "ProjectedShadowmap",
+ "ShaderInputName": "m_projectedShadowmaps",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader",
+ "ImageViewDesc": {
+ "IsArray": 1
+ }
+ },
+ {
+ "Name": "ExponentialShadowmapProjected",
+ "ShaderInputName": "m_projectedExponentialShadowmap",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader",
+ "ImageViewDesc": {
+ "IsArray": 1
+ }
+ },
+ {
+ "Name": "TileLightData",
+ "SlotType": "Input",
+ "ShaderInputName": "m_tileLightData",
+ "ScopeAttachmentUsage": "Shader"
+ },
+ {
+ "Name": "LightListRemapped",
+ "SlotType": "Input",
+ "ShaderInputName": "m_lightListRemapped",
+ "ScopeAttachmentUsage": "Shader"
+ },
+ // Input/Outputs...
+ {
+ "Name": "DepthStencilInputOutput",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "DepthStencil"
+ },
+ // Outputs...
+ {
+ "Name": "LightingOutput",
+ "SlotType": "Output",
+ "ScopeAttachmentUsage": "RenderTarget",
+ "LoadStoreAction": {
+ "ClearValue": {
+ "Value": [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "LoadAction": "Clear"
+ }
+ }
+ ],
+ "ImageAttachments": [
+ {
+ "Name": "LightingAttachment",
+ "SizeSource": {
+ "Source": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ },
+ "MultisampleSource": {
+ "Pass": "This",
+ "Attachment": "DepthStencilInputOutput"
+ },
+ "ImageDescriptor": {
+ "Format": "R16G16B16A16_FLOAT",
+ "SharedQueueMask": "Graphics"
+ }
+ },
+ {
+ "Name": "BRDFTexture",
+ "Lifetime": "Imported",
+ "AssetRef": {
+ "FilePath": "Textures/BRDFTexture.attimage"
+ }
+ }
+ ],
+ "Connections": [
+ {
+ "LocalSlot": "LightingOutput",
+ "AttachmentRef": {
+ "Pass": "This",
+ "Attachment": "LightingAttachment"
+ }
+ },
+ {
+ "LocalSlot": "BRDFTextureInput",
+ "AttachmentRef": {
+ "Pass": "This",
+ "Attachment": "BRDFTexture"
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LowEndPipeline.pass b/Gems/Atom/Feature/Common/Assets/Passes/LowEndPipeline.pass
new file mode 100644
index 0000000000..b19569fb9d
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/LowEndPipeline.pass
@@ -0,0 +1,344 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData": {
+ "PassTemplate": {
+ "Name": "LowEndPipelineTemplate",
+ "PassClass": "ParentPass",
+ "Slots": [
+ {
+ "Name": "SwapChainOutput",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "RenderTarget"
+ }
+ ],
+ "PassRequests": [
+ {
+ "Name": "MorphTargetPass",
+ "TemplateName": "MorphTargetPassTemplate"
+ },
+ {
+ "Name": "SkinningPass",
+ "TemplateName": "SkinningPassTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "SkinnedMeshOutputStream",
+ "AttachmentRef": {
+ "Pass": "MorphTargetPass",
+ "Attachment": "MorphTargetDeltaOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "DepthPrePass",
+ "TemplateName": "DepthMSAAParentTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "SkinnedMeshes",
+ "AttachmentRef": {
+ "Pass": "SkinningPass",
+ "Attachment": "SkinnedMeshOutputStream"
+ }
+ },
+ {
+ "LocalSlot": "SwapChainOutput",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "LightCullingPass",
+ "TemplateName": "LightCullingParentTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "SkinnedMeshes",
+ "AttachmentRef": {
+ "Pass": "SkinningPass",
+ "Attachment": "SkinnedMeshOutputStream"
+ }
+ },
+ {
+ "LocalSlot": "DepthMSAA",
+ "AttachmentRef": {
+ "Pass": "DepthPrePass",
+ "Attachment": "DepthMSAA"
+ }
+ },
+ {
+ "LocalSlot": "SwapChainOutput",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ShadowPass",
+ "TemplateName": "ShadowParentTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "SkinnedMeshes",
+ "AttachmentRef": {
+ "Pass": "SkinningPass",
+ "Attachment": "SkinnedMeshOutputStream"
+ }
+ },
+ {
+ "LocalSlot": "SwapChainOutput",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ForwardPass",
+ "TemplateName": "LowEndForwardPassTemplate",
+ "Connections": [
+ // Inputs...
+ {
+ "LocalSlot": "DirectionalLightShadowmap",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "DirectionalShadowmap"
+ }
+ },
+ {
+ "LocalSlot": "ExponentialShadowmapDirectional",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "DirectionalESM"
+ }
+ },
+ {
+ "LocalSlot": "ProjectedShadowmap",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "ProjectedShadowmap"
+ }
+ },
+ {
+ "LocalSlot": "ExponentialShadowmapProjected",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "ProjectedESM"
+ }
+ },
+ {
+ "LocalSlot": "TileLightData",
+ "AttachmentRef": {
+ "Pass": "LightCullingPass",
+ "Attachment": "TileLightData"
+ }
+ },
+ {
+ "LocalSlot": "LightListRemapped",
+ "AttachmentRef": {
+ "Pass": "LightCullingPass",
+ "Attachment": "LightListRemapped"
+ }
+ },
+ // Input/Outputs...
+ {
+ "LocalSlot": "DepthStencilInputOutput",
+ "AttachmentRef": {
+ "Pass": "DepthPrePass",
+ "Attachment": "DepthMSAA"
+ }
+ }
+ ],
+ "PassData": {
+ "$type": "RasterPassData",
+ "DrawListTag": "lowEndForward",
+ "PipelineViewTag": "MainCamera",
+ "PassSrgAsset": {
+ "FilePath": "shaderlib/atom/features/pbr/forwardpasssrg.azsli:PassSrg"
+ }
+ }
+ },
+ {
+ "Name": "SkyBoxPass",
+ "TemplateName": "SkyBoxTemplate",
+ "Enabled": true,
+ "Connections": [
+ {
+ "LocalSlot": "SpecularInputOutput",
+ "AttachmentRef": {
+ "Pass": "ForwardPass",
+ "Attachment": "LightingOutput"
+ }
+ },
+ {
+ "LocalSlot": "SkyBoxDepth",
+ "AttachmentRef": {
+ "Pass": "ForwardPass",
+ "Attachment": "DepthStencilInputOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "MSAAResolvePass",
+ "TemplateName": "MSAAResolveColorTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "Input",
+ "AttachmentRef": {
+ "Pass": "SkyBoxPass",
+ "Attachment": "SpecularInputOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "TransparentPass",
+ "TemplateName": "TransparentParentTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "DirectionalShadowmap",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "DirectionalShadowmap"
+ }
+ },
+ {
+ "LocalSlot": "DirectionalESM",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "DirectionalESM"
+ }
+ },
+ {
+ "LocalSlot": "ProjectedShadowmap",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "ProjectedShadowmap"
+ }
+ },
+ {
+ "LocalSlot": "ProjectedESM",
+ "AttachmentRef": {
+ "Pass": "ShadowPass",
+ "Attachment": "ProjectedESM"
+ }
+ },
+ {
+ "LocalSlot": "TileLightData",
+ "AttachmentRef": {
+ "Pass": "LightCullingPass",
+ "Attachment": "TileLightData"
+ }
+ },
+ {
+ "LocalSlot": "LightListRemapped",
+ "AttachmentRef": {
+ "Pass": "LightCullingPass",
+ "Attachment": "LightListRemapped"
+ }
+ },
+ {
+ "LocalSlot": "DepthStencil",
+ "AttachmentRef": {
+ "Pass": "DepthPrePass",
+ "Attachment": "Depth"
+ }
+ },
+ {
+ "LocalSlot": "InputOutput",
+ "AttachmentRef": {
+ "Pass": "MSAAResolvePass",
+ "Attachment": "Output"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "LightAdaptation",
+ "TemplateName": "LightAdaptationParentTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "LightingInput",
+ "AttachmentRef": {
+ "Pass": "TransparentPass",
+ "Attachment": "InputOutput"
+ }
+ },
+ {
+ "LocalSlot": "SwapChainOutput",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "AuxGeomPass",
+ "TemplateName": "AuxGeomPassTemplate",
+ "Enabled": true,
+ "Connections": [
+ {
+ "LocalSlot": "ColorInputOutput",
+ "AttachmentRef": {
+ "Pass": "LightAdaptation",
+ "Attachment": "Output"
+ }
+ },
+ {
+ "LocalSlot": "DepthInputOutput",
+ "AttachmentRef": {
+ "Pass": "DepthPrePass",
+ "Attachment": "Depth"
+ }
+ }
+ ],
+ "PassData": {
+ "$type": "RasterPassData",
+ "DrawListTag": "auxgeom",
+ "PipelineViewTag": "MainCamera"
+ }
+ },
+ {
+ "Name": "UIPass",
+ "TemplateName": "UIParentTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "InputOutput",
+ "AttachmentRef": {
+ "Pass": "AuxGeomPass",
+ "Attachment": "ColorInputOutput"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "CopyToSwapChain",
+ "TemplateName": "FullscreenCopyTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "Input",
+ "AttachmentRef": {
+ "Pass": "UIPass",
+ "Attachment": "InputOutput"
+ }
+ },
+ {
+ "LocalSlot": "Output",
+ "AttachmentRef": {
+ "Pass": "Parent",
+ "Attachment": "SwapChainOutput"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
index dda120e164..40d6a51e77 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
@@ -315,13 +315,6 @@
"Attachment": "SpecularInputOutput"
}
},
- {
- "LocalSlot": "ReflectionInputOutput",
- "AttachmentRef": {
- "Pass": "ReflectionsPass",
- "Attachment": "ReflectionOutput"
- }
- },
{
"LocalSlot": "SkyBoxDepth",
"AttachmentRef": {
@@ -338,8 +331,8 @@
{
"LocalSlot": "ReflectionInput",
"AttachmentRef": {
- "Pass": "SkyBoxPass",
- "Attachment": "ReflectionInputOutput"
+ "Pass": "ReflectionsPass",
+ "Attachment": "ReflectionOutput"
}
},
{
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
index b83ab65ff2..2421d7fbe7 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
+++ b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
@@ -483,6 +483,18 @@
{
"Name": "UIParentTemplate",
"Path": "Passes/UIParent.pass"
+ },
+ {
+ "Name": "LightAdaptationParentTemplate",
+ "Path": "Passes/LightAdaptationParent.pass"
+ },
+ {
+ "Name": "LowEndForwardPassTemplate",
+ "Path": "Passes/LowEndForward.pass"
+ },
+ {
+ "Name": "LowEndPipelineTemplate",
+ "Path": "Passes/LowEndPipeline.pass"
}
]
}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PostProcessParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/PostProcessParent.pass
index 37b1ee5c5a..36f7f1e985 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/PostProcessParent.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/PostProcessParent.pass
@@ -40,7 +40,7 @@
{
"LocalSlot": "Output",
"AttachmentRef": {
- "Pass": "DisplayMapperPass",
+ "Pass": "LightAdaptation",
"Attachment": "Output"
}
},
@@ -54,8 +54,8 @@
{
"LocalSlot": "LuminanceMipChainOutput",
"AttachmentRef": {
- "Pass": "DownsampleLuminanceMipChain",
- "Attachment": "MipChainInputOutput"
+ "Pass": "LightAdaptation",
+ "Attachment": "LuminanceMipChainOutput"
}
}
],
@@ -115,94 +115,16 @@
}
]
},
- // Everything before this point deals in raw lighting values
- // ---------------------------------------------------------
- // Everything after starts to map to values we see on screen
{
- "Name": "DownsampleLuminanceMinAvgMax",
- "TemplateName": "DownsampleLuminanceMinAvgMaxCS",
+ "Name": "LightAdaptation",
+ "TemplateName": "LightAdaptationParentTemplate",
"Connections": [
{
- "LocalSlot": "Input",
+ "LocalSlot": "LightingInput",
"AttachmentRef": {
"Pass": "BloomPass",
"Attachment": "InputOutput"
}
- }
- ]
- },
- {
- "Name": "DownsampleLuminanceMipChain",
- "TemplateName": "DownsampleMipChainTemplate",
- "Connections": [
- {
- "LocalSlot": "MipChainInputOutput",
- "AttachmentRef": {
- "Pass": "DownsampleLuminanceMinAvgMax",
- "Attachment": "Output"
- }
- }
- ],
- "PassData": {
- "$type": "DownsampleMipChainPassData",
- "ShaderAsset": {
- "FilePath": "Shaders/PostProcessing/DownsampleMinAvgMaxCS.shader"
- }
- }
- },
- {
- "Name": "EyeAdaptationPass",
- "TemplateName": "EyeAdaptationTemplate",
- "Enabled": false,
- "Connections": [
- {
- "LocalSlot": "SceneLuminanceInput",
- "AttachmentRef": {
- "Pass": "DownsampleLuminanceMipChain",
- "Attachment": "MipChainInputOutput"
- }
- }
- ]
- },
- {
- "Name": "LookModificationTransformPass",
- "TemplateName": "LookModificationTransformTemplate",
- "Enabled": true,
- "Connections": [
- {
- "LocalSlot": "Input",
- "AttachmentRef": {
- "Pass": "BloomPass",
- "Attachment": "InputOutput"
- }
- },
- {
- "LocalSlot": "EyeAdaptationDataInput",
- "AttachmentRef": {
- "Pass": "EyeAdaptationPass",
- "Attachment": "EyeAdaptationDataInputOutput"
- }
- },
- {
- "LocalSlot": "SwapChainOutput",
- "AttachmentRef": {
- "Pass": "Parent",
- "Attachment": "SwapChainOutput"
- }
- }
- ]
- },
- {
- "Name": "DisplayMapperPass",
- "TemplateName": "DisplayMapperTemplate",
- "Enabled": true,
- "Connections": [
- {
- "LocalSlot": "Input",
- "AttachmentRef": {
- "Pass": "LookModificationTransformPass",
- "Attachment": "Output"
- }
},
{
"LocalSlot": "SwapChainOutput",
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
index 57f442e5de..fb16271ba7 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
@@ -12,11 +12,6 @@
"SlotType": "InputOutput",
"ScopeAttachmentUsage": "RenderTarget"
},
- {
- "Name": "ReflectionInputOutput",
- "SlotType": "InputOutput",
- "ScopeAttachmentUsage": "RenderTarget"
- },
{
"Name": "SkyBoxDepth",
"SlotType": "InputOutput",
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli
index acc215f1c9..5821deb3b1 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli
@@ -10,6 +10,21 @@
*
*/
+#ifdef UNIFIED_FORWARD_OUTPUT
+
+struct ForwardPassOutput
+{
+ float4 m_color : SV_Target0;
+};
+
+struct ForwardPassOutputWithDepth
+{
+ float4 m_color : SV_Target0;
+ float m_depth : SV_Depth;
+};
+
+#else
+
struct ForwardPassOutput
{
float4 m_diffuseColor : SV_Target0; //!< RGB = Diffuse Lighting, A = Blend Alpha (for blended surfaces) OR A = special encoding of surfaceScatteringFactor, m_subsurfaceScatteringQuality, o_enableSubsurfaceScattering
@@ -30,3 +45,5 @@ struct ForwardPassOutputWithDepth
float4 m_normal : SV_Target4;
float m_depth : SV_Depth;
};
+
+#endif
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
new file mode 100644
index 0000000000..acc215f1c9
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
@@ -0,0 +1,32 @@
+/*
+* 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.
+*
+*/
+
+struct ForwardPassOutput
+{
+ float4 m_diffuseColor : SV_Target0; //!< RGB = Diffuse Lighting, A = Blend Alpha (for blended surfaces) OR A = special encoding of surfaceScatteringFactor, m_subsurfaceScatteringQuality, o_enableSubsurfaceScattering
+ float4 m_specularColor : SV_Target1; //!< RGB = Specular Lighting, A = Unused
+ float4 m_albedo : SV_Target2; //!< RGB = Surface albedo pre-multiplied by other factors that will be multiplied later by diffuse GI, A = specularOcclusion
+ float4 m_specularF0 : SV_Target3; //!< RGB = Specular F0, A = roughness
+ float4 m_normal : SV_Target4; //!< RGB10 = EncodeNormalSignedOctahedron(worldNormal), A2 = multiScatterCompensationEnabled
+};
+
+struct ForwardPassOutputWithDepth
+{
+ // See above for descriptions of special encodings
+
+ float4 m_diffuseColor : SV_Target0;
+ float4 m_specularColor : SV_Target1;
+ float4 m_albedo : SV_Target2;
+ float4 m_specularF0 : SV_Target3;
+ float4 m_normal : SV_Target4;
+ float m_depth : SV_Depth;
+};
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
new file mode 100644
index 0000000000..907e67ada5
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
@@ -0,0 +1,24 @@
+/*
+* 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
+
+// These are a list of quality options to specify as macros (either in azsl or in shader files)
+//
+// QUALITY_LOW_END
+
+#ifdef QUALITY_LOW_END
+
+#define UNIFIED_FORWARD_OUTPUT 1
+
+#endif
+
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl
index 92f8c3f638..865d657d85 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl
@@ -53,13 +53,22 @@ PSOutput MainPS(VSOutput IN)
uint width, height, samples;
PassSrg::m_reflection.GetDimensions(width, height, samples);
+ float nonZeroSamples = 0.0f;
for (uint sampleIndex = 0; sampleIndex < samples; ++sampleIndex)
{
- reflection += PassSrg::m_reflection.Load(IN.m_position.xy, sampleIndex).rgb;
+ float3 reflectionSample = PassSrg::m_reflection.Load(IN.m_position.xy, sampleIndex).rgb;
+ if(any(reflectionSample))
+ {
+ reflection += reflectionSample;
+ nonZeroSamples += 1.0f;
+ }
+ }
+
+ if(nonZeroSamples != 0.0f)
+ {
+ reflection /= nonZeroSamples;
}
- reflection /= samples;
-
PSOutput OUT;
OUT.m_color = float4(reflection, 1.0f);
return OUT;
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
index 1ee30a4f98..a7de426374 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
@@ -102,7 +102,6 @@ float3 GetCubemapCoords(float3 original)
struct PSOutput
{
float4 m_specular : SV_Target0;
- float4 m_reflection : SV_Target1;
};
PSOutput MainPS(VSOutput input)
@@ -163,6 +162,5 @@ PSOutput MainPS(VSOutput input)
PSOutput OUT;
OUT.m_specular = float4(color, 1.0);
- OUT.m_reflection = float4(color, 1.0);
return OUT;
}
diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake
index f14fb4f4a0..6902d456ff 100644
--- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake
+++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake
@@ -52,6 +52,8 @@ set(FILES
Materials/Types/StandardPBR_ForwardPass_EDS.shader
Materials/Types/StandardPBR_HandleOpacityDoubleSided.lua
Materials/Types/StandardPBR_HandleOpacityMode.lua
+ Materials/Types/StandardPBR_LowEndForward.azsl
+ Materials/Types/StandardPBR_LowEndForward.shader
Materials/Types/StandardPBR_ParallaxState.lua
Materials/Types/StandardPBR_Roughness.lua
Materials/Types/StandardPBR_ShaderEnable.lua
@@ -116,6 +118,7 @@ set(FILES
Passes/DiffuseProbeGridBlendDistance.pass
Passes/DiffuseProbeGridBlendIrradiance.pass
Passes/DiffuseProbeGridBorderUpdate.pass
+ Passes/DiffuseProbeGridClassification.pass
Passes/DiffuseProbeGridDownsample.pass
Passes/DiffuseProbeGridRayTracing.pass
Passes/DiffuseProbeGridRelocation.pass
@@ -144,6 +147,7 @@ set(FILES
Passes/FullscreenCopy.pass
Passes/FullscreenOutputOnly.pass
Passes/ImGui.pass
+ Passes/LightAdaptationParent.pass
Passes/LightCulling.pass
Passes/LightCullingHeatmap.pass
Passes/LightCullingParent.pass
@@ -152,6 +156,8 @@ set(FILES
Passes/LightCullingTilePrepareMSAA.pass
Passes/LookModificationComposite.pass
Passes/LookModificationTransform.pass
+ Passes/LowEndForward.pass
+ Passes/LowEndPipeline.pass
Passes/LuminanceHeatmap.pass
Passes/LuminanceHistogramGenerator.pass
Passes/MainPipeline.pass
@@ -179,8 +185,10 @@ set(FILES
Passes/ReflectionScreenSpace.pass
Passes/ReflectionScreenSpaceBlur.pass
Passes/ReflectionScreenSpaceBlurHorizontal.pass
+ Passes/ReflectionScreenSpaceBlurMobile.pass
Passes/ReflectionScreenSpaceBlurVertical.pass
Passes/ReflectionScreenSpaceComposite.pass
+ Passes/ReflectionScreenSpaceMobile.pass
Passes/ReflectionScreenSpaceTrace.pass
Passes/Reflections_nomsaa.pass
Passes/ShadowParent.pass
@@ -205,6 +213,7 @@ set(FILES
ShaderLib/Atom/Features/IndirectRendering.azsli
ShaderLib/Atom/Features/MatrixUtility.azsli
ShaderLib/Atom/Features/ParallaxMapping.azsli
+ ShaderLib/Atom/Features/ShaderQualityOptions.azsli
ShaderLib/Atom/Features/SphericalHarmonicsUtility.azsli
ShaderLib/Atom/Features/SrgSemantics.azsli
ShaderLib/Atom/Features/ColorManagement/TransformColor.azsli
@@ -234,6 +243,7 @@ set(FILES
ShaderLib/Atom/Features/PBR/Hammersley.azsli
ShaderLib/Atom/Features/PBR/LightingOptions.azsli
ShaderLib/Atom/Features/PBR/LightingUtils.azsli
+ ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
ShaderLib/Atom/Features/PBR/TransparentPassSrg.azsli
ShaderLib/Atom/Features/PBR/Lighting/DualSpecularLighting.azsli
ShaderLib/Atom/Features/PBR/Lighting/EnhancedLighting.azsli
From 24aa0f852179f94bce8ae354b66c6804628bd1b7 Mon Sep 17 00:00:00 2001
From: antonmic
Date: Fri, 7 May 2021 20:56:40 -0700
Subject: [PATCH 016/142] skybox pass separation for single vs double output
---
.../Common/Assets/Passes/OpaqueParent.pass | 13 ++++--
.../Assets/Passes/PassTemplates.azasset | 4 ++
.../Feature/Common/Assets/Passes/SkyBox.pass | 5 +++
.../Assets/Passes/SkyBox_TwoOutputs.pass | 43 +++++++++++++++++++
.../Reflections/ReflectionComposite.azsl | 15 ++-----
.../Common/Assets/Shaders/SkyBox/SkyBox.azsl | 11 +++++
.../Shaders/SkyBox/SkyBox_TwoOutputs.azsl | 15 +++++++
.../Shaders/SkyBox/SkyBox_TwoOutputs.shader | 22 ++++++++++
8 files changed, 113 insertions(+), 15 deletions(-)
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/SkyBox_TwoOutputs.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.shader
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
index 40d6a51e77..a691fe2534 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
@@ -305,7 +305,7 @@
},
{
"Name": "SkyBoxPass",
- "TemplateName": "SkyBoxTemplate",
+ "TemplateName": "SkyBoxTwoOutputsTemplate",
"Enabled": true,
"Connections": [
{
@@ -315,6 +315,13 @@
"Attachment": "SpecularInputOutput"
}
},
+ {
+ "LocalSlot": "ReflectionInputOutput",
+ "AttachmentRef": {
+ "Pass": "ReflectionsPass",
+ "Attachment": "ReflectionOutput"
+ }
+ },
{
"LocalSlot": "SkyBoxDepth",
"AttachmentRef": {
@@ -331,8 +338,8 @@
{
"LocalSlot": "ReflectionInput",
"AttachmentRef": {
- "Pass": "ReflectionsPass",
- "Attachment": "ReflectionOutput"
+ "Pass": "SkyBoxPass",
+ "Attachment": "ReflectionInputOutput"
}
},
{
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
index 2421d7fbe7..c56e8932b1 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
+++ b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
@@ -92,6 +92,10 @@
"Name": "SkyBoxTemplate",
"Path": "Passes/SkyBox.pass"
},
+ {
+ "Name": "SkyBoxTwoOutputsTemplate",
+ "Path": "Passes/SkyBox_TwoOutputs.pass"
+ },
{
"Name": "UIPassTemplate",
"Path": "Passes/UI.pass"
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
index fb16271ba7..57f442e5de 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
@@ -12,6 +12,11 @@
"SlotType": "InputOutput",
"ScopeAttachmentUsage": "RenderTarget"
},
+ {
+ "Name": "ReflectionInputOutput",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "RenderTarget"
+ },
{
"Name": "SkyBoxDepth",
"SlotType": "InputOutput",
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox_TwoOutputs.pass b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox_TwoOutputs.pass
new file mode 100644
index 0000000000..0ed7b39288
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox_TwoOutputs.pass
@@ -0,0 +1,43 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData": {
+ "PassTemplate": {
+ "Name": "SkyBoxTwoOutputsTemplate",
+ "PassClass": "FullScreenTriangle",
+ "Slots": [
+ {
+ "Name": "SpecularInputOutput",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "RenderTarget"
+ },
+ {
+ "Name": "ReflectionInputOutput",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "RenderTarget"
+ },
+ {
+ "Name": "SkyBoxDepth",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "DepthStencil"
+ }
+ ],
+ "PassData": {
+ "$type": "FullscreenTrianglePassData",
+ "ShaderAsset": {
+ "FilePath": "shaders/skybox/skybox_twooutputs.shader"
+ },
+ "PipelineViewTag": "MainCamera",
+ "ShaderDataMappings": {
+ "FloatMappings": [
+ {
+ "Name": "m_sunIntensityMultiplier",
+ "Value": 1.0
+ }
+ ]
+ }
+ }
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl
index 865d657d85..92f8c3f638 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.azsl
@@ -53,22 +53,13 @@ PSOutput MainPS(VSOutput IN)
uint width, height, samples;
PassSrg::m_reflection.GetDimensions(width, height, samples);
- float nonZeroSamples = 0.0f;
for (uint sampleIndex = 0; sampleIndex < samples; ++sampleIndex)
{
- float3 reflectionSample = PassSrg::m_reflection.Load(IN.m_position.xy, sampleIndex).rgb;
- if(any(reflectionSample))
- {
- reflection += reflectionSample;
- nonZeroSamples += 1.0f;
- }
- }
-
- if(nonZeroSamples != 0.0f)
- {
- reflection /= nonZeroSamples;
+ reflection += PassSrg::m_reflection.Load(IN.m_position.xy, sampleIndex).rgb;
}
+ reflection /= samples;
+
PSOutput OUT;
OUT.m_color = float4(reflection, 1.0f);
return OUT;
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
index a7de426374..4b3e9536b7 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
@@ -10,6 +10,11 @@
*
*/
+// Static Options:
+//
+// SKYBOX_TWO_OUTPUTS - Allows the skybox to render to two rendertargets instead of one
+
+
#include
#include
#include
@@ -102,6 +107,9 @@ float3 GetCubemapCoords(float3 original)
struct PSOutput
{
float4 m_specular : SV_Target0;
+#ifdef SKYBOX_TWO_OUTPUTS
+ float4 m_reflection : SV_Target1;
+#endif
};
PSOutput MainPS(VSOutput input)
@@ -162,5 +170,8 @@ PSOutput MainPS(VSOutput input)
PSOutput OUT;
OUT.m_specular = float4(color, 1.0);
+#ifdef SKYBOX_TWO_OUTPUTS
+ OUT.m_reflection = float4(color, 1.0);
+#endif
return OUT;
}
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl
new file mode 100644
index 0000000000..99d7b45e4c
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl
@@ -0,0 +1,15 @@
+/*
+* 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.
+*
+*/
+
+#define SKYBOX_TWO_OUTPUTS
+
+#include "SkyBox.azsl"
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.shader b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.shader
new file mode 100644
index 0000000000..ec80d4a20e
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.shader
@@ -0,0 +1,22 @@
+{
+ "Source" : "SkyBox_TwoOutputs",
+
+ "DepthStencilState" : {
+ "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
+ },
+
+ "ProgramSettings":
+ {
+ "EntryPoints":
+ [
+ {
+ "name": "MainVS",
+ "type": "Vertex"
+ },
+ {
+ "name": "MainPS",
+ "type": "Fragment"
+ }
+ ]
+ }
+}
From cb245730a1f214c4891817b11bb617166f73c7b7 Mon Sep 17 00:00:00 2001
From: antonmic
Date: Sun, 9 May 2021 23:01:24 -0700
Subject: [PATCH 017/142] work in progress
---
.../Types/StandardPBR_LowEndForward.azsl | 2 ++
.../Feature/Common/Assets/Passes/Forward.pass | 20 -------------------
.../Feature/Common/Assets/Passes/SkyBox.pass | 5 -----
.../Shaders/SkyBox/SkyBox_TwoOutputs.azsl | 2 ++
.../atom_feature_common_asset_files.cmake | 4 ++++
5 files changed, 8 insertions(+), 25 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl
index a690cbf84a..c87faffcbe 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_LowEndForward.azsl
@@ -10,6 +10,8 @@
*
*/
+// NOTE: This file is a temporary workaround until .shader files can #define macros for their .azsl files
+
#define QUALITY_LOW_END 1
#include "StandardPBR_ForwardPass.azsl"
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass b/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass
index 3dcc90ac5c..b66e3bb4e1 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass
@@ -222,19 +222,6 @@
"AssetRef": {
"FilePath": "Textures/BRDFTexture.attimage"
}
- },
- {
- "Name": "ScatterDistanceImage",
- "SizeSource": {
- "Source": {
- "Pass": "Parent",
- "Attachment": "SwapChainOutput"
- }
- },
- "ImageDescriptor": {
- "Format": "R11G11B10_FLOAT",
- "SharedQueueMask": "Graphics"
- }
}
],
"Connections": [
@@ -279,13 +266,6 @@
"Pass": "This",
"Attachment": "BRDFTexture"
}
- },
- {
- "LocalSlot": "ScatterDistanceOutput",
- "AttachmentRef": {
- "Pass": "This",
- "Attachment": "ScatterDistanceImage"
- }
}
]
}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
index 57f442e5de..fb16271ba7 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass
@@ -12,11 +12,6 @@
"SlotType": "InputOutput",
"ScopeAttachmentUsage": "RenderTarget"
},
- {
- "Name": "ReflectionInputOutput",
- "SlotType": "InputOutput",
- "ScopeAttachmentUsage": "RenderTarget"
- },
{
"Name": "SkyBoxDepth",
"SlotType": "InputOutput",
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl
index 99d7b45e4c..feacd2f44f 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox_TwoOutputs.azsl
@@ -10,6 +10,8 @@
*
*/
+// NOTE: This file is a temporary workaround until .shader files can #define macros for their .azsl files
+
#define SKYBOX_TWO_OUTPUTS
#include "SkyBox.azsl"
diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake
index 6902d456ff..7419c1e669 100644
--- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake
+++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake
@@ -54,6 +54,7 @@ set(FILES
Materials/Types/StandardPBR_HandleOpacityMode.lua
Materials/Types/StandardPBR_LowEndForward.azsl
Materials/Types/StandardPBR_LowEndForward.shader
+ Materials/Types/StandardPBR_LowEndForward_EDS.shader
Materials/Types/StandardPBR_ParallaxState.lua
Materials/Types/StandardPBR_Roughness.lua
Materials/Types/StandardPBR_ShaderEnable.lua
@@ -194,6 +195,7 @@ set(FILES
Passes/ShadowParent.pass
Passes/Skinning.pass
Passes/SkyBox.pass
+ Passes/SkyBox_TwoOutputs.pass
Passes/SMAA1xApplyLinearHDRColor.pass
Passes/SMAA1xApplyPerceptualColor.pass
Passes/SMAABlendingWeightCalculation.pass
@@ -483,4 +485,6 @@ set(FILES
Shaders/SkinnedMesh/LinearSkinningPassSRG.azsli
Shaders/SkyBox/SkyBox.azsl
Shaders/SkyBox/SkyBox.shader
+ Shaders/SkyBox/SkyBox_TwoOutputs.azsl
+ Shaders/SkyBox/SkyBox_TwoOutputs.shader
)
From 92ef82f9331dee683f3d4df7869c27d913321420 Mon Sep 17 00:00:00 2001
From: pereslav
Date: Mon, 10 May 2021 19:52:23 +0100
Subject: [PATCH 018/142] Added handling parented net entities
---
.../EntityReplicationManager.cpp | 6 ++---
.../NetworkEntity/NetworkEntityManager.cpp | 26 ++++++++++++++++++-
.../Pipeline/NetworkPrefabProcessor.cpp | 4 +++
3 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp
index 74bdcd5cf0..64eb3fcc6a 100644
--- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp
+++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp
@@ -550,10 +550,10 @@ namespace Multiplayer
{
replicatorEntity = entityList[0];
}
-
- AZ_Assert(replicatorEntity != nullptr, "Failed to create entity from prefab %s", prefabEntityId.m_prefabName.GetCStr());
- if (replicatorEntity == nullptr)
+ else
{
+ AZ_Assert(false, "There should be exactly one created entity out of prefab %s, index %d. Got: %d",
+ prefabEntityId.m_prefabName.GetCStr(), prefabEntityId.m_entityOffset, entityList.size());
return false;
}
}
diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp
index ce55f66caa..3bcd613d8b 100644
--- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp
+++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp
@@ -334,15 +334,39 @@ namespace Multiplayer
const AzFramework::Spawnable::EntityList& entities = spawnable.GetEntities();
size_t entitiesSize = entities.size();
+ using EntityIdMap = AZStd::unordered_map;
+ EntityIdMap originalToCloneIdMap;
+
for (size_t i = 0; i < entitiesSize; ++i)
{
- AZ::Entity* clone = serializeContext->CloneObject(entities[i].get());
+ AZ::Entity* originalEntity = entities[i].get();
+ AZ::Entity* clone = serializeContext->CloneObject(originalEntity);
AZ_Assert(clone != nullptr, "Failed to clone spawnable entity.");
+
clone->SetId(AZ::Entity::MakeId());
+ originalToCloneIdMap[originalEntity->GetId()] = clone->GetId();
+
NetBindComponent* netBindComponent = clone->FindComponent();
if (netBindComponent != nullptr)
{
+ // Update TransformComponent parent Id. It is guaranteed for the entities array to be sorted from parent->child here.
+ auto* transformComponent = clone->FindComponent();
+ AZ::EntityId parentId = transformComponent->GetParentId();
+ if (parentId.IsValid())
+ {
+ auto it = originalToCloneIdMap.find(parentId);
+ if (it != originalToCloneIdMap.end())
+ {
+ transformComponent->SetParentRelative(it->second);
+ }
+ else
+ {
+ AZ_Warning("NetworkEntityManager", false, "Entity %s doesn't have the parent entity %s present in network.spawnable",
+ clone->GetName().c_str(), parentId.ToString().data());
+ }
+ }
+
PrefabEntityId prefabEntityId;
prefabEntityId.m_prefabName = m_networkPrefabLibrary.GetPrefabNameFromAssetId(spawnable.GetId());
prefabEntityId.m_entityOffset = aznumeric_cast(i);
diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp
index 4962d16fb4..56201bd5fd 100644
--- a/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp
+++ b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp
@@ -59,6 +59,7 @@ namespace Multiplayer
return result;
}
+
void NetworkPrefabProcessor::ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab)
{
using namespace AzToolsFramework::Prefab;
@@ -175,6 +176,9 @@ namespace Multiplayer
(*it)->InvalidateDependencies();
(*it)->EvaluateDependencies();
}
+
+ SpawnableUtils::SortEntitiesByTransformHierarchy(*networkSpawnable);
+
context.GetProcessedObjects().push_back(AZStd::move(object));
}
else
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 019/142] 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 8e4d0d73dcea7f50d05a9318011de9a07e0d88e6 Mon Sep 17 00:00:00 2001
From: antonmic
Date: Tue, 11 May 2021 01:29:53 -0700
Subject: [PATCH 020/142] Good working state, but material always emmits low
end draw item
---
.../Materials/Types/StandardPBR.materialtype | 24 ++--
.../Atom/Features/PBR/Lights/Ibl.azsli | 108 ++++++------------
.../Atom/Features/ShaderQualityOptions.azsli | 3 +-
.../Code/Include/Atom/RPI.Public/Pass/Pass.h | 1 +
.../RPI/Code/Source/RPI.Public/Pass/Pass.cpp | 4 +-
5 files changed, 59 insertions(+), 81 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
index 1612bf43b0..47d8a9d9d5 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
@@ -1304,9 +1304,11 @@
"textureProperty": "baseColor.textureMap",
"useTextureProperty": "baseColor.useTexture",
"dependentProperties": ["baseColor.textureMapUv", "baseColor.textureBlendMode"],
- "shaderTags": [
+ "shaderTags": [
"ForwardPass",
- "ForwardPass_EDS"
+ "ForwardPass_EDS",
+ "LowEndForward",
+ "LowEndForward_EDS"
],
"shaderOption": "o_baseColor_useTexture"
}
@@ -1317,9 +1319,11 @@
"textureProperty": "metallic.textureMap",
"useTextureProperty": "metallic.useTexture",
"dependentProperties": ["metallic.textureMapUv"],
- "shaderTags": [
+ "shaderTags": [
"ForwardPass",
- "ForwardPass_EDS"
+ "ForwardPass_EDS",
+ "LowEndForward",
+ "LowEndForward_EDS"
],
"shaderOption": "o_metallic_useTexture"
}
@@ -1330,9 +1334,11 @@
"textureProperty": "specularF0.textureMap",
"useTextureProperty": "specularF0.useTexture",
"dependentProperties": ["specularF0.textureMapUv"],
- "shaderTags": [
+ "shaderTags": [
"ForwardPass",
- "ForwardPass_EDS"
+ "ForwardPass_EDS",
+ "LowEndForward",
+ "LowEndForward_EDS"
],
"shaderOption": "o_specularF0_useTexture"
}
@@ -1343,9 +1349,11 @@
"textureProperty": "normal.textureMap",
"useTextureProperty": "normal.useTexture",
"dependentProperties": ["normal.textureMapUv", "normal.factor", "normal.flipX", "normal.flipY"],
- "shaderTags": [
+ "shaderTags": [
"ForwardPass",
- "ForwardPass_EDS"
+ "ForwardPass_EDS",
+ "LowEndForward",
+ "LowEndForward_EDS"
],
"shaderOption": "o_normal_useTexture"
}
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli
index 7400005508..721c48835d 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli
@@ -18,32 +18,30 @@
#include
#include
-void ApplyIblDiffuse(
+float3 GetIblDiffuse(
float3 normal,
float3 albedo,
- float3 diffuseResponse,
- out float3 outDiffuse)
+ float3 diffuseResponse)
{
float3 irradianceDir = MultiplyVectorQuaternion(normal, SceneSrg::m_iblOrientation);
float3 diffuseSample = SceneSrg::m_diffuseEnvMap.Sample(SceneSrg::m_samplerEnv, GetCubemapCoords(irradianceDir)).rgb;
- outDiffuse = diffuseResponse * albedo * diffuseSample;
+ return diffuseResponse * albedo * diffuseSample;
}
-void ApplyIblSpecular(
+float3 GetIblSpecular(
float3 position,
float3 normal,
float3 specularF0,
float roughnessLinear,
float3 dirToCamera,
- float2 brdf,
- out float3 outSpecular)
+ float2 brdf)
{
float3 reflectDir = reflect(-dirToCamera, normal);
reflectDir = MultiplyVectorQuaternion(reflectDir, SceneSrg::m_iblOrientation);
// global
- outSpecular = SceneSrg::m_specularEnvMap.SampleLevel(SceneSrg::m_samplerEnv, GetCubemapCoords(reflectDir), GetRoughnessMip(roughnessLinear)).rgb;
+ float3 outSpecular = SceneSrg::m_specularEnvMap.SampleLevel(SceneSrg::m_samplerEnv, GetCubemapCoords(reflectDir), GetRoughnessMip(roughnessLinear)).rgb;
outSpecular *= (specularF0 * brdf.x + brdf.y);
// reflection probe
@@ -72,86 +70,54 @@ void ApplyIblSpecular(
outSpecular = lerp(outSpecular, probeSpecular, blendAmount);
}
+ return outSpecular;
}
void ApplyIBL(Surface surface, inout LightingData lightingData)
{
- if (o_opacity_mode == OpacityMode::Blended || o_opacity_mode == OpacityMode::TintedTransparent)
+#ifdef FORCE_IBL_IN_FORWARD_PASS
+ bool useDiffuseIbl = true;
+ bool useSpecularIbl = true;
+ bool useIbl = true;
+#else
+ bool useDiffuseIbl = (o_opacity_mode == OpacityMode::Blended || o_opacity_mode == OpacityMode::TintedTransparent);
+ bool useSpecularIbl = (useDiffuseIbl || o_meshUseForwardPassIBLSpecular || o_materialUseForwardPassIBLSpecular);
+ bool useIbl = o_enableIBL && (useDiffuseIbl || useSpecularIbl);
+#endif
+
+ if(useIbl)
{
- // transparencies currently require IBL in the forward pass
- if (o_enableIBL)
+ float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure);
+
+ if(useDiffuseIbl)
{
- float3 iblDiffuse = 0.0f;
- ApplyIblDiffuse(
- surface.normal,
- surface.albedo,
- lightingData.diffuseResponse,
- iblDiffuse);
-
- float3 iblSpecular = 0.0f;
- ApplyIblSpecular(
- surface.position,
- surface.normal,
- surface.specularF0,
- surface.roughnessLinear,
- lightingData.dirToCamera,
- lightingData.brdf,
- iblSpecular);
-
- // Adjust IBL lighting by exposure.
- float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure);
+ float3 iblDiffuse = GetIblDiffuse(surface.normal, surface.albedo, lightingData.diffuseResponse);
lightingData.diffuseLighting += (iblDiffuse * iblExposureFactor * lightingData.diffuseAmbientOcclusion);
- lightingData.specularLighting += (iblSpecular * iblExposureFactor);
}
- }
- else if (o_meshUseForwardPassIBLSpecular || o_materialUseForwardPassIBLSpecular)
- {
- if (o_enableIBL)
- {
- float3 iblSpecular = 0.0f;
- ApplyIblSpecular(
- surface.position,
- surface.normal,
- surface.specularF0,
- surface.roughnessLinear,
- lightingData.dirToCamera,
- lightingData.brdf,
- iblSpecular);
+ if(useSpecularIbl)
+ {
+ float3 iblSpecular = GetIblSpecular(surface.position, surface.normal, surface.specularF0, surface.roughnessLinear, lightingData.dirToCamera, lightingData.brdf);
iblSpecular *= lightingData.multiScatterCompensation;
- if (o_clearCoat_feature_enabled)
+ if (o_clearCoat_feature_enabled && surface.clearCoat.factor > 0.0f)
{
- if (surface.clearCoat.factor > 0.0f)
- {
- float clearCoatNdotV = saturate(dot(surface.clearCoat.normal, lightingData.dirToCamera));
- clearCoatNdotV = max(clearCoatNdotV, 0.01f); // [GFX TODO][ATOM-4466] This is a current band-aid for specular noise at grazing angles.
- float2 clearCoatBrdf = PassSrg::m_brdfMap.Sample(PassSrg::LinearSampler, GetBRDFTexCoords(surface.clearCoat.roughness, clearCoatNdotV)).rg;
+ float clearCoatNdotV = saturate(dot(surface.clearCoat.normal, lightingData.dirToCamera));
+ clearCoatNdotV = max(clearCoatNdotV, 0.01f); // [GFX TODO][ATOM-4466] This is a current band-aid for specular noise at grazing angles.
+ float2 clearCoatBrdf = PassSrg::m_brdfMap.Sample(PassSrg::LinearSampler, GetBRDFTexCoords(surface.clearCoat.roughness, clearCoatNdotV)).rg;
- // clear coat uses fixed IOR = 1.5 represents polyurethane which is the most common material for gloss clear coat
- // coat layer assumed to be dielectric thus don't need multiple scattering compensation
- float3 clearCoatSpecularF0 = float3(0.04f, 0.04f, 0.04f);
- float3 clearCoatIblSpecular = 0.0f;
+ // clear coat uses fixed IOR = 1.5 represents polyurethane which is the most common material for gloss clear coat
+ // coat layer assumed to be dielectric thus don't need multiple scattering compensation
+ float3 clearCoatSpecularF0 = float3(0.04f, 0.04f, 0.04f);
+ float3 clearCoatIblSpecular = GetIblSpecular(surface.position, surface.clearCoat.normal, clearCoatSpecularF0, surface.clearCoat.roughness, lightingData.dirToCamera, clearCoatBrdf);
- ApplyIblSpecular(
- surface.position,
- surface.clearCoat.normal,
- clearCoatSpecularF0,
- surface.clearCoat.roughness,
- lightingData.dirToCamera,
- clearCoatBrdf,
- clearCoatIblSpecular);
-
- clearCoatIblSpecular *= surface.clearCoat.factor;
+ clearCoatIblSpecular *= surface.clearCoat.factor;
- // attenuate base layer energy
- float3 clearCoatResponse = FresnelSchlickWithRoughness(clearCoatNdotV, clearCoatSpecularF0, surface.clearCoat.roughness) * surface.clearCoat.factor;
- iblSpecular = iblSpecular * (1.0 - clearCoatResponse) * (1.0 - clearCoatResponse) + clearCoatIblSpecular;
- }
+ // attenuate base layer energy
+ float3 clearCoatResponse = FresnelSchlickWithRoughness(clearCoatNdotV, clearCoatSpecularF0, surface.clearCoat.roughness) * surface.clearCoat.factor;
+ iblSpecular = iblSpecular * (1.0 - clearCoatResponse) * (1.0 - clearCoatResponse) + clearCoatIblSpecular;
}
-
- float iblExposureFactor = pow(2.0f, SceneSrg::m_iblExposure);
lightingData.specularLighting += (iblSpecular * iblExposureFactor);
}
}
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
index 907e67ada5..d6fb259548 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
@@ -18,7 +18,8 @@
#ifdef QUALITY_LOW_END
-#define UNIFIED_FORWARD_OUTPUT 1
+#define UNIFIED_FORWARD_OUTPUT 1
+#define FORCE_IBL_IN_FORWARD_PASS 1
#endif
diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h
index b0d6bd4117..1cba71ae7e 100644
--- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h
+++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h
@@ -381,6 +381,7 @@ namespace AZ
uint64_t m_createdByPassRequest : 1;
uint64_t m_initialized : 1;
uint64_t m_enabled : 1;
+ uint64_t m_parentEnabled : 1;
uint64_t m_alreadyCreated : 1;
uint64_t m_alreadyReset : 1;
uint64_t m_alreadyPrepared : 1;
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp
index 9401d1a9e0..f93d661b0f 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp
@@ -93,11 +93,12 @@ namespace AZ
void Pass::SetEnabled(bool enabled)
{
m_flags.m_enabled = enabled;
+ OnHierarchyChange();
}
bool Pass::IsEnabled() const
{
- return m_flags.m_enabled;
+ return m_flags.m_enabled && (m_flags.m_parentEnabled || m_parent == nullptr);
}
// --- Error Logging ---
@@ -140,6 +141,7 @@ namespace AZ
}
// Set new tree depth and path
+ m_flags.m_parentEnabled = m_parent->IsEnabled();
m_treeDepth = m_parent->m_treeDepth + 1;
m_path = ConcatPassName(m_parent->m_path, m_name);
m_flags.m_partOfHierarchy = m_parent->m_flags.m_partOfHierarchy;
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 021/142] 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 dbe16c6a164cf89342749efbbd2d0785d473a37a Mon Sep 17 00:00:00 2001
From: darapan
Date: Tue, 11 May 2021 05:07:16 -0700
Subject: [PATCH 022/142] "fixing review comments"
---
...s.py => Editor_NewExistingLevels_Works.py} | 17 +++++---------
.../Gem/PythonTests/smoke/ImportPathHelper.py | 16 -------------
....py => test_CLITool_AssetBuilder_Works.py} | 7 +++---
...> test_CLITool_AssetBundlerBatch_Works.py} | 7 +++---
...test_CLITool_AssetProcessorBatch_Works.py} | 23 +++++--------------
....py => test_CLITool_AzTestRunner_Works.py} | 7 +++---
...st_CLITool_PythonBindingsExample_Works.py} | 8 +++----
...st_CLITool_SerializeContextTools_Works.py} | 7 +++---
...=> test_Editor_NewExistingLevels_Works.py} | 6 +++--
...> test_StaticTools_GenPakShaders_Works.py} | 7 +++---
10 files changed, 34 insertions(+), 71 deletions(-)
rename AutomatedTesting/Gem/PythonTests/smoke/{Editor_NewExistingLevels.py => Editor_NewExistingLevels_Works.py} (93%)
delete mode 100644 AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py
rename AutomatedTesting/Gem/PythonTests/smoke/{test_AssetBuilder.py => test_CLITool_AssetBuilder_Works.py} (89%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_AssetBundlerBatch.py => test_CLITool_AssetBundlerBatch_Works.py} (89%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_AssetProcessorBatch.py => test_CLITool_AssetProcessorBatch_Works.py} (54%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_AzTestRunner.py => test_CLITool_AzTestRunner_Works.py} (90%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_PythonBindingsExample.py => test_CLITool_PythonBindingsExample_Works.py} (87%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_SerializeContextTools.py => test_CLITool_SerializeContextTools_Works.py} (88%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_Editor_NewExistingLevels.py => test_Editor_NewExistingLevels_Works.py} (88%)
rename AutomatedTesting/Gem/PythonTests/smoke/{test_Statictool_Scripts.py => test_StaticTools_GenPakShaders_Works.py} (90%)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py b/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels_Works.py
similarity index 93%
rename from AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py
rename to AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels_Works.py
index 4e4a037ec9..ce46da494c 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels_Works.py
@@ -9,9 +9,7 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-Test case ID: LY-123945
Test Case Title: Create Test for UI apps- Editor
-URL of the test case: https://jira.agscollab.com/browse/LY-123945
"""
@@ -30,7 +28,7 @@ class Tests():
# fmt: on
-def Editor_NewExistingLevels():
+def Editor_NewExistingLevels_Works():
"""
Summary: Perform the below operations on Editor
@@ -69,9 +67,9 @@ def Editor_NewExistingLevels():
"""
import os
- import hydra_editor_utils as hydra
- from utils import TestHelper as helper
- from utils import Report
+ import editor_python_test_tools.hydra_editor_utils as hydra
+ from editor_python_test_tools.utils import TestHelper as helper
+ from editor_python_test_tools.utils import Report
import azlmbr.bus as bus
import azlmbr.editor as editor
import azlmbr.legacy.general as general
@@ -146,10 +144,7 @@ def Editor_NewExistingLevels():
if __name__ == "__main__":
- import ImportPathHelper as imports
- imports.init()
+ from editor_python_test_tools.utils import Report
- from utils import Report
-
- Report.start_test(Editor_NewExistingLevels)
+ Report.start_test(Editor_NewExistingLevels_Works)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py
deleted file mode 100644
index 70bed6e526..0000000000
--- a/AutomatedTesting/Gem/PythonTests/smoke/ImportPathHelper.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-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.
-"""
-
-def init():
- import os
- import sys
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../EditorPythonTestTools/editor_python_test_tools')
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
similarity index 89%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
index da2abff50f..e20809b1b8 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBuilder.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
@@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124059 : CLI tool - AssetBuilder
+CLI tool - AssetBuilder
Launch AssetBuilder and Verify the help message
"""
@@ -23,7 +23,7 @@ import ly_test_tools.environment.process_utils as process_utils
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
@pytest.mark.SUITE_smoke
-class TestAssetBuilder(object):
+class TestCLIToolAssetBuilderWorks(object):
@pytest.fixture(autouse=True)
def setup_teardown(self, request):
def teardown():
@@ -31,8 +31,7 @@ class TestAssetBuilder(object):
request.addfinalizer(teardown)
- @pytest.mark.test_case_id("LY-124059")
- def test_AssetBuilder(self, request, editor, build_directory):
+ def test_CLITool_AssetBuilder_Works(self, request, editor, build_directory):
file_path = os.path.join(build_directory, "AssetBuilder")
help_message = "AssetBuilder is part of the Asset Processor"
# Launch AssetBuilder
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBundlerBatch_Works.py
similarity index 89%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBundlerBatch_Works.py
index d361c62f5f..8a20715b3f 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetBundlerBatch.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBundlerBatch_Works.py
@@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124060 : CLI tool - AssetBundlerBatch
+CLI tool - AssetBundlerBatch
Launch AssetBundlerBatch and Verify the help message
"""
@@ -23,7 +23,7 @@ import ly_test_tools.environment.process_utils as process_utils
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
@pytest.mark.SUITE_smoke
-class TestAssetBundlerBatch(object):
+class TestCLIToolAssetBundlerBatchWorks(object):
@pytest.fixture(autouse=True)
def setup_teardown(self, request):
def teardown():
@@ -31,8 +31,7 @@ class TestAssetBundlerBatch(object):
request.addfinalizer(teardown)
- @pytest.mark.test_case_id("LY-124060")
- def test_AssetBundlerBatch(self, request, editor, build_directory):
+ def test_CLITool_AssetBundlerBatch_Works(self, request, editor, build_directory):
file_path = os.path.join(build_directory, "AssetBundlerBatch")
help_message = "Specifies the Seed List file to operate on by path"
# Launch AssetBundlerBatch
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetProcessorBatch_Works.py
similarity index 54%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetProcessorBatch_Works.py
index ab541b94c1..30e681050c 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_AssetProcessorBatch.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetProcessorBatch_Works.py
@@ -10,34 +10,23 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124061 : CLI tool - AssetProcessorBatch
+CLI tool - AssetProcessorBatch
Launch AssetProcessorBatch and Shutdown AssetProcessorBatch without any crash
"""
# Import builtin libraries
import pytest
-import os
-import sys
-
-sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../assetpipeline/")
-
-# Import fixtures
-from ap_fixtures.asset_processor_fixture import asset_processor as asset_processor
+from ly_test_tools.o3de.asset_processor import AssetProcessor
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
-@pytest.mark.usefixtures("asset_processor")
@pytest.mark.SUITE_smoke
-class TestsAssetProcessorBatchs(object):
- @pytest.mark.test_case_id("LY-124061")
- def test_AssetProcessorBatch(self, asset_processor):
+class TestsCLIToolAssetProcessorBatchWorks(object):
+ def test_CLITool_AssetProcessorBatch_Works(self, workspace):
"""
Test Launching AssetProcessorBatch and verifies that is shuts down without issue
"""
- # Create a sample asset root so we don't process every asset for every platform
- asset_processor.create_temp_asset_root()
- # Launch AssetProcessorBatch, assert batch processing success
- result, _ = asset_processor.batch_process()
- assert result, "AP Batch failed"
+ asset_processor = AssetProcessor(workspace)
+ asset_processor.batch_process()
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AzTestRunner_Works.py
similarity index 90%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AzTestRunner_Works.py
index d1bc44fe2f..5983cd7496 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_AzTestRunner.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AzTestRunner_Works.py
@@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124062 : CLI tool - AzTestRunner
+CLI tool - AzTestRunner
Launch AzTestRunner and Verify the help message
"""
@@ -23,7 +23,7 @@ import ly_test_tools.environment.process_utils as process_utils
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
@pytest.mark.SUITE_smoke
-class TestAzTestRunner(object):
+class TestCLIToolAzTestRunnerWorks(object):
@pytest.fixture(autouse=True)
def setup_teardown(self, request):
def teardown():
@@ -31,8 +31,7 @@ class TestAzTestRunner(object):
request.addfinalizer(teardown)
- @pytest.mark.test_case_id("LY-124062")
- def test_AzTestRunner(self, request, editor, build_directory):
+ def test_CLITool_AzTestRunner_Works(self, request, editor, build_directory):
file_path = os.path.join(build_directory, "AzTestRunner")
help_message = "OKAY Symbol found: AzRunUnitTests"
# Launch AzTestRunner
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_PythonBindingsExample_Works.py
similarity index 87%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_PythonBindingsExample_Works.py
index 140e76fc96..68d12d0e70 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_PythonBindingsExample.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_PythonBindingsExample_Works.py
@@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124064 : CLI tool - PythonBindingsExample
+CLI tool - PythonBindingsExample
Launch PythonBindingsExample and Verify the help message
"""
@@ -23,7 +23,7 @@ import ly_test_tools.environment.process_utils as process_utils
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
@pytest.mark.SUITE_smoke
-class TestPythonBindingsExample(object):
+class TestCLIToolPythonBindingsExampleWorks(object):
@pytest.fixture(autouse=True)
def setup_teardown(self, request):
def teardown():
@@ -31,8 +31,7 @@ class TestPythonBindingsExample(object):
request.addfinalizer(teardown)
- @pytest.mark.test_case_id("LY-124064")
- def test_PythonBindingsExample(self, request, editor, build_directory):
+ def test_CLITool_PythonBindingsExample_Works(self, request, editor, build_directory):
file_path = os.path.join(build_directory, "PythonBindingsExample")
help_message = "--help Prints the help text"
# Launch PythonBindingsExample
@@ -42,4 +41,3 @@ class TestPythonBindingsExample(object):
), f"Error occurred while launching {file_path}: {output.stderr}"
# Verify help message
assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
-
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_SerializeContextTools_Works.py
similarity index 88%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_SerializeContextTools_Works.py
index 763d84625d..94178ca9d6 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_SerializeContextTools.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_SerializeContextTools_Works.py
@@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124066 : CLI tool - SerializeContextTools
+CLI tool - SerializeContextTools
Launch SerializeContextTools and Verify the help message
"""
@@ -23,7 +23,7 @@ import ly_test_tools.environment.process_utils as process_utils
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
@pytest.mark.SUITE_smoke
-class TestSerializeContextTools(object):
+class TestCLIToolSerializeContextToolsWorks(object):
@pytest.fixture(autouse=True)
def setup_teardown(self, request):
def teardown():
@@ -31,8 +31,7 @@ class TestSerializeContextTools(object):
request.addfinalizer(teardown)
- @pytest.mark.test_case_id("LY-124066")
- def test_SerializeContextTools(self, request, editor, build_directory):
+ def test_CLITool_SerializeContextTools_Works(self, request, editor, build_directory):
file_path = os.path.join(build_directory, "SerializeContextTools")
help_message = "Converts a file with an ObjectStream to the new JSON"
# Launch SerializeContextTools
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
similarity index 88%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
index 85d53d098d..510734a4a2 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
@@ -24,11 +24,13 @@ import ly_test_tools.environment.file_system as file_system
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.parametrize("level", ["temp_level"])
class TestAutomation(TestAutomationBase):
- def test_Editor_NewExistingLevels(self, request, workspace, editor, level, project, launcher_platform):
+ def test_Editor_NewExistingLevels_Works(self, request, workspace, editor, level, project, launcher_platform):
def teardown():
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+
request.addfinalizer(teardown)
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
- from . import Editor_NewExistingLevels as test_module
+ from . import Editor_NewExistingLevels_Works as test_module
+
self._run_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py b/AutomatedTesting/Gem/PythonTests/smoke/test_StaticTools_GenPakShaders_Works.py
similarity index 90%
rename from AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
rename to AutomatedTesting/Gem/PythonTests/smoke/test_StaticTools_GenPakShaders_Works.py
index 8eac2ff099..05b91a602d 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_Statictool_Scripts.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_StaticTools_GenPakShaders_Works.py
@@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
-LY-124058: Static tool scripts
+Static tool scripts
Launch Static tool and Verify the help message
"""
@@ -34,9 +34,8 @@ def verify_help_message(static_tool):
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.usefixtures("automatic_process_killer")
@pytest.mark.SUITE_smoke
-class TestStatictoolScripts(object):
- @pytest.mark.test_case_id("LY-124058")
- def test_Statictool_Scripts(self, request, editor):
+class TestStaticToolsGenPakShadersWorks(object):
+ def test_StaticTools_GenPakShaders_Works(self, request, editor):
static_tools = [
os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "gen_shaders.py"),
os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "get_shader_list.py"),
From d48df87bda8d653025e4a9c6fc8f45e873cbf443 Mon Sep 17 00:00:00 2001
From: darapan
Date: Tue, 11 May 2021 05:20:06 -0700
Subject: [PATCH 023/142] "Updating Cmake"
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 127db8e7e6..2a0a7f8008 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -399,3 +399,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
Legacy::Editor
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
+ COMPONENT
+ Smoke
+ )
+endif()
\ No newline at end of file
From 006f4d2e8294da878161ce9db571e55b84fe2dc9 Mon Sep 17 00:00:00 2001
From: darapan
Date: Tue, 11 May 2021 05:34:38 -0700
Subject: [PATCH 024/142] "Adding Ap Test"
---
.../Gem/PythonTests/CMakeLists.txt | 2 +-
.../test_UIApps_AssetProcessor_CheckIdle.py | 41 +++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletion(-)
create mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 2a0a7f8008..e91190f8e7 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -402,4 +402,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
COMPONENT
Smoke
)
-endif()
\ No newline at end of file
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py b/AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py
new file mode 100644
index 0000000000..0f5f870461
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py
@@ -0,0 +1,41 @@
+"""
+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.
+"""
+
+"""
+UI Apps: AssetProcessor
+Open AssetProcessor, Wait until AssetProcessor is Idle
+Close AssetProcessor.
+"""
+
+
+import pytest
+from ly_test_tools.o3de.asset_processor import AssetProcessor
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.SUITE_smoke
+class TestsUIAppsAssetProcessorCheckIdle(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ self.asset_processor = None
+
+ def teardown():
+ self.asset_processor.stop()
+
+ request.addfinalizer(teardown)
+
+ def test_UIApps_AssetProcessor_CheckIdle(self, workspace):
+ """
+ Test Launching AssetProcessorBatch and verifies that is shuts down without issue
+ """
+ self.asset_processor = AssetProcessor(workspace)
+ self.asset_processor.gui_process()
From f7641f3d3845dad3acb219b727521a4ab26fc8a1 Mon Sep 17 00:00:00 2001
From: darapan
Date: Tue, 11 May 2021 10:56:42 -0700
Subject: [PATCH 025/142] "Changing TIMEOUT in cmakelist.txt"
---
AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index e91190f8e7..a81630b880 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -392,7 +392,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
TEST_SUITE smoke
TEST_SERIAL
PATH ${CMAKE_CURRENT_LIST_DIR}/smoke
- TIMEOUT 3600
+ TIMEOUT 1500
RUNTIME_DEPENDENCIES
AZ::AssetProcessor
AZ::PythonBindingsExample
From 9775822778ec2cf8003ea86f455906f75bce1c14 Mon Sep 17 00:00:00 2001
From: scottr
Date: Tue, 11 May 2021 16:09:16 -0700
Subject: [PATCH 026/142] [cpack_installer] remove wxs file ext from lfs filter
---
.gitattributes | 1 -
1 file changed, 1 deletion(-)
diff --git a/.gitattributes b/.gitattributes
index 1755def66a..55b43e4ba7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -115,5 +115,4 @@
*.wav filter=lfs diff=lfs merge=lfs -text
*.webm filter=lfs diff=lfs merge=lfs -text
*.wem filter=lfs diff=lfs merge=lfs -text
-*.wxs filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
From c777e2e35301cd0054fe39e8fdccb5e632d48a21 Mon Sep 17 00:00:00 2001
From: scottr
Date: Tue, 11 May 2021 18:07:19 -0700
Subject: [PATCH 027/142] [cpack_installer] some cpack cleanup and prep for
online installer support (pre/post build steps)
---
cmake/Packaging.cmake | 38 ++++++++++++-------
.../Platform/Windows/PackagingPostBuild.cmake | 12 ++++++
.../Platform/Windows/Packaging_windows.cmake | 8 +++-
.../Windows/platform_windows_files.cmake | 1 +
4 files changed, 43 insertions(+), 16 deletions(-)
create mode 100644 cmake/Platform/Windows/PackagingPostBuild.cmake
diff --git a/cmake/Packaging.cmake b/cmake/Packaging.cmake
index 4f6565edc7..e398ea7509 100644
--- a/cmake/Packaging.cmake
+++ b/cmake/Packaging.cmake
@@ -13,6 +13,30 @@ if(NOT PAL_TRAIT_BUILD_CPACK_SUPPORTED)
return()
endif()
+# set the common cpack variables first so they are accessible via configure_file
+# when the platforms specific properties are applied below
+set(LY_INSTALLER_DOWNLOAD_URL "" CACHE PATH "URL embded into the installer to download additional artifacts")
+
+set(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}")
+set(CPACK_PACKAGE_VERSION "${LY_VERSION_STRING}")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Installation Tool")
+
+string(TOLOWER ${PROJECT_NAME} _project_name_lower)
+set(CPACK_PACKAGE_FILE_NAME "${_project_name_lower}_${LY_VERSION_STRING}_installer")
+
+set(DEFAULT_LICENSE_NAME "Apache-2.0")
+set(DEFAULT_LICENSE_FILE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
+
+set(CPACK_RESOURCE_FILE_LICENSE ${DEFAULT_LICENSE_FILE})
+
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_VERSION}")
+
+# custom cpack cache variables for use in pre/post build scripts
+set(CPACK_SOURCE_DIR ${CMAKE_SOURCE_DIR}/cmake)
+set(CPACK_BINARY_DIR ${CMAKE_BINARY_DIR}/installer)
+set(CPACK_DOWNLOAD_URL ${LY_INSTALLER_DOWNLOAD_URL})
+
+# attempt to apply platform specific settings
ly_get_absolute_pal_filename(pal_dir ${CMAKE_SOURCE_DIR}/cmake/Platform/${PAL_HOST_PLATFORM_NAME})
include(${pal_dir}/Packaging_${PAL_HOST_PLATFORM_NAME_LOWERCASE}.cmake)
@@ -21,20 +45,6 @@ if(NOT CPACK_GENERATOR)
return()
endif()
-set(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}")
-set(CPACK_PACKAGE_VERSION "${LY_VERSION_STRING}")
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Installation Tool")
-
-string(TOLOWER ${PROJECT_NAME} _project_name_lower)
-set(CPACK_PACKAGE_FILE_NAME "${_project_name_lower}_installer")
-
-set(DEFAULT_LICENSE_NAME "Apache-2.0")
-set(DEFAULT_LICENSE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
-
-set(CPACK_RESOURCE_FILE_LICENSE ${DEFAULT_LICENSE_FILE})
-
-set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_VERSION}")
-
# IMPORTANT: required to be included AFTER setting all property overrides
include(CPack REQUIRED)
diff --git a/cmake/Platform/Windows/PackagingPostBuild.cmake b/cmake/Platform/Windows/PackagingPostBuild.cmake
new file mode 100644
index 0000000000..fe57904003
--- /dev/null
+++ b/cmake/Platform/Windows/PackagingPostBuild.cmake
@@ -0,0 +1,12 @@
+#
+# 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.
+#
+
+message(STATUS "Hello from CPack post build!")
diff --git a/cmake/Platform/Windows/Packaging_windows.cmake b/cmake/Platform/Windows/Packaging_windows.cmake
index 8aa6f2386d..ba3ce011a4 100644
--- a/cmake/Platform/Windows/Packaging_windows.cmake
+++ b/cmake/Platform/Windows/Packaging_windows.cmake
@@ -32,7 +32,7 @@ set(CPACK_GENERATOR "WIX")
# however, they are unique for each run. instead, let's do the auto generation here and add it to
# the cache for run persistence. an additional cache file will be used to store the information on
# the original generation so we still have the ability to detect if they are still being used.
-set(_guid_cache_file "${CMAKE_BINARY_DIR}/installer/wix_guid_cache.cmake")
+set(_guid_cache_file "${CPACK_BINARY_DIR}/wix_guid_cache.cmake")
if(NOT EXISTS ${_guid_cache_file})
set(_wix_guid_namespace "6D43F57A-2917-4AD9-B758-1F13CDB08593")
@@ -89,4 +89,8 @@ endif()
set(CPACK_WIX_PRODUCT_GUID ${LY_WIX_PRODUCT_GUID})
set(CPACK_WIX_UPGRADE_GUID ${LY_WIX_UPGRADE_GUID})
-set(CPACK_WIX_TEMPLATE "${CMAKE_SOURCE_DIR}/cmake/Platform/Windows/PackagingTemplate.wxs.in")
+set(CPACK_WIX_TEMPLATE "${CPACK_SOURCE_DIR}/Platform/Windows/PackagingTemplate.wxs.in")
+
+set(CPACK_POST_BUILD_SCRIPTS
+ ${CPACK_SOURCE_DIR}/Platform/Windows/PackagingPostBuild.cmake
+)
diff --git a/cmake/Platform/Windows/platform_windows_files.cmake b/cmake/Platform/Windows/platform_windows_files.cmake
index 2fc869b43e..579621d5ea 100644
--- a/cmake/Platform/Windows/platform_windows_files.cmake
+++ b/cmake/Platform/Windows/platform_windows_files.cmake
@@ -24,5 +24,6 @@ set(FILES
PALDetection_windows.cmake
Install_windows.cmake
Packaging_windows.cmake
+ PackagingPostBuild.cmake
PackagingTemplate.wxs.in
)
From f5e91c6e4284f00e64db5cc4ba4e0678be111b1c Mon Sep 17 00:00:00 2001
From: antonmic
Date: Wed, 12 May 2021 10:39:18 -0700
Subject: [PATCH 028/142] Added low end shaders in StandardPBR_ShaderEnable.lua
---
.../Assets/Materials/Types/StandardPBR_ShaderEnable.lua | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua
index 7c3d989c35..2733713122 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua
@@ -29,26 +29,33 @@ function Process(context)
local depthPass = context:GetShaderByTag("DepthPass")
local shadowMap = context:GetShaderByTag("Shadowmap")
local forwardPassEDS = context:GetShaderByTag("ForwardPass_EDS")
+ local lowEndForwardEDS = context:GetShaderByTag("LowEndForward_EDS")
+
local depthPassWithPS = context:GetShaderByTag("DepthPass_WithPS")
local shadowMapWitPS = context:GetShaderByTag("Shadowmap_WithPS")
local forwardPass = context:GetShaderByTag("ForwardPass")
+ local lowEndForward = context:GetShaderByTag("LowEndForward")
if parallaxEnabled and parallaxPdoEnabled then
depthPass:SetEnabled(false)
shadowMap:SetEnabled(false)
forwardPassEDS:SetEnabled(false)
+ lowEndForwardEDS:SetEnabled(false)
depthPassWithPS:SetEnabled(true)
shadowMapWitPS:SetEnabled(true)
forwardPass:SetEnabled(true)
+ lowEndForward:SetEnabled(true)
else
depthPass:SetEnabled(opacityMode == OpacityMode_Opaque)
shadowMap:SetEnabled(opacityMode == OpacityMode_Opaque)
forwardPassEDS:SetEnabled((opacityMode == OpacityMode_Opaque) or (opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
+ lowEndForwardEDS:SetEnabled((opacityMode == OpacityMode_Opaque) or (opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
depthPassWithPS:SetEnabled(opacityMode == OpacityMode_Cutout)
shadowMapWitPS:SetEnabled(opacityMode == OpacityMode_Cutout)
forwardPass:SetEnabled(opacityMode == OpacityMode_Cutout)
+ lowEndForward:SetEnabled(opacityMode == OpacityMode_Cutout)
end
context:GetShaderByTag("DepthPassTransparentMin"):SetEnabled((opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent))
From 92b7099d78953eef8552633201b98d8f07597529 Mon Sep 17 00:00:00 2001
From: antonmic
Date: Wed, 12 May 2021 11:10:13 -0700
Subject: [PATCH 029/142] Some clean up
---
.../Common/Assets/Materials/Types/StandardPBR.materialtype | 7 -------
.../Assets/Materials/Types/StandardPBR_ForwardPass.azsl | 4 ++--
.../Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli | 3 +++
.../ShaderLib/Atom/Features/ShaderQualityOptions.azsli | 4 +---
Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl | 6 ++----
5 files changed, 8 insertions(+), 16 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
index 47d8a9d9d5..a9a3e9e09b 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
@@ -77,13 +77,6 @@
],
"properties": {
"general": [
- {
- "id": "useLowEndShader",
- "displayName": "Use Low End",
- "description": "Whether to use the low end shader.",
- "type": "Bool",
- "defaultValue": false
- },
{
"id": "applySpecularAA",
"displayName": "Apply Specular AA",
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl
index 1e6fafda9b..7ae5934d4f 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl
@@ -321,7 +321,7 @@ ForwardPassOutputWithDepth StandardPbr_ForwardPassPS(VSOutput IN, bool isFrontFa
#ifdef UNIFIED_FORWARD_OUTPUT
OUT.m_color.rgb = lightingOutput.m_diffuseColor.rgb + lightingOutput.m_specularColor.rgb;
- OUT.m_color.a = 1.0f;
+ OUT.m_color.a = lightingOutput.m_diffuseColor.a;
OUT.m_depth = depth;
#else
OUT.m_diffuseColor = lightingOutput.m_diffuseColor;
@@ -344,7 +344,7 @@ ForwardPassOutput StandardPbr_ForwardPassPS_EDS(VSOutput IN, bool isFrontFace :
#ifdef UNIFIED_FORWARD_OUTPUT
OUT.m_color.rgb = lightingOutput.m_diffuseColor.rgb + lightingOutput.m_specularColor.rgb;
- OUT.m_color.a = 1.0f;
+ OUT.m_color.a = lightingOutput.m_diffuseColor.a;
#else
OUT.m_diffuseColor = lightingOutput.m_diffuseColor;
OUT.m_specularColor = lightingOutput.m_specularColor;
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli
index 721c48835d..3e3544fe9e 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli
@@ -12,6 +12,9 @@
#pragma once
+// --- Static Options Available ---
+// FORCE_IBL_IN_FORWARD_PASS - forces IBL lighting to be run in the forward pass, used in pipelines that don't have a reflection pass
+
#include
#include
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
index d6fb259548..6e89269f8d 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli
@@ -12,9 +12,7 @@
#pragma once
-// These are a list of quality options to specify as macros (either in azsl or in shader files)
-//
-// QUALITY_LOW_END
+// This file translates quality option macros like QUALITY_LOW_END to their relevant settings
#ifdef QUALITY_LOW_END
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
index 4b3e9536b7..1bebb2ec47 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl
@@ -10,10 +10,8 @@
*
*/
-// Static Options:
-//
-// SKYBOX_TWO_OUTPUTS - Allows the skybox to render to two rendertargets instead of one
-
+// --- Static Options Available ---
+// SKYBOX_TWO_OUTPUTS - Skybox renders to two rendertargets instead of one (SkyBox_TwoOutputs.pass writes to specular and reflection targets)
#include
#include
From b52388f5ebfb5af09505a99fe1e416ae12907dd0 Mon Sep 17 00:00:00 2001
From: antonmic
Date: Wed, 12 May 2021 11:11:45 -0700
Subject: [PATCH 030/142] Remove unused file
---
.../PBR/LowEndForwardPassOutput.azsli | 32 -------------------
1 file changed, 32 deletions(-)
delete mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
deleted file mode 100644
index acc215f1c9..0000000000
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LowEndForwardPassOutput.azsli
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-* 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.
-*
-*/
-
-struct ForwardPassOutput
-{
- float4 m_diffuseColor : SV_Target0; //!< RGB = Diffuse Lighting, A = Blend Alpha (for blended surfaces) OR A = special encoding of surfaceScatteringFactor, m_subsurfaceScatteringQuality, o_enableSubsurfaceScattering
- float4 m_specularColor : SV_Target1; //!< RGB = Specular Lighting, A = Unused
- float4 m_albedo : SV_Target2; //!< RGB = Surface albedo pre-multiplied by other factors that will be multiplied later by diffuse GI, A = specularOcclusion
- float4 m_specularF0 : SV_Target3; //!< RGB = Specular F0, A = roughness
- float4 m_normal : SV_Target4; //!< RGB10 = EncodeNormalSignedOctahedron(worldNormal), A2 = multiScatterCompensationEnabled
-};
-
-struct ForwardPassOutputWithDepth
-{
- // See above for descriptions of special encodings
-
- float4 m_diffuseColor : SV_Target0;
- float4 m_specularColor : SV_Target1;
- float4 m_albedo : SV_Target2;
- float4 m_specularF0 : SV_Target3;
- float4 m_normal : SV_Target4;
- float m_depth : SV_Depth;
-};
From 124ca1618a2e463e98ca4e7c5d3aa67793c4676a Mon Sep 17 00:00:00 2001
From: mriegger
Date: Wed, 12 May 2021 20:51:56 -0700
Subject: [PATCH 031/142] Making shadow res of 1024 and bicubic pcf the default
---
.../CommonFeatures/CoreLights/AreaLightComponentConfig.h | 2 +-
.../CoreLights/DirectionalLightComponentConfig.h | 4 ++--
.../Code/Source/CoreLights/EditorAreaLightComponent.cpp | 6 +++---
.../Source/CoreLights/EditorDirectionalLightComponent.cpp | 6 +++---
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h
index fe40cabc12..31cdb34ddd 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h
@@ -62,7 +62,7 @@ namespace AZ
bool m_enableShadow = false;
ShadowmapSize m_shadowmapMaxSize = ShadowmapSize::Size256;
ShadowFilterMethod m_shadowFilterMethod = ShadowFilterMethod::None;
- PcfMethod m_pcfMethod = PcfMethod::BoundarySearch;
+ PcfMethod m_pcfMethod = PcfMethod::Bicubic;
float m_boundaryWidthInDegrees = 0.25f;
uint16_t m_predictionSampleCount = 4;
uint16_t m_filteringSampleCount = 12;
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h
index 7de2857541..237c1f3016 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h
@@ -61,7 +61,7 @@ namespace AZ
float m_shadowFarClipDistance = 100.f;
//! Width/Height of shadowmap images.
- ShadowmapSize m_shadowmapSize = MaxShadowmapImageSize;
+ ShadowmapSize m_shadowmapSize = ShadowmapSize::Size1024;
//! Number of cascades.
uint32_t m_cascadeCount = 4;
@@ -117,7 +117,7 @@ namespace AZ
//! It is used only when the pixel is predicted as on the boundary.
uint16_t m_filteringSampleCount = 32;
- PcfMethod m_pcfMethod = PcfMethod::BoundarySearch;
+ PcfMethod m_pcfMethod = PcfMethod::Bicubic;
bool IsSplitManual() const;
bool IsSplitAutomatic() const;
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp
index a77bcfdd12..69bec21a6c 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp
@@ -173,10 +173,10 @@ namespace AZ
->DataElement(
Edit::UIHandlers::ComboBox, &AreaLightComponentConfig::m_pcfMethod, "Pcf method",
"Type of PCF to use.\n"
- " Boundary search: do several taps to first determine if we are on a shadow boundary\n"
- " Bicubic: a smooth, fixed-size kernel \n")
- ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary search")
+ " Bicubic: a smooth, fixed-size kernel \n"
+ " Boundary search: do several taps to first determine if we are on a shadow boundary\n")
->EnumAttribute(PcfMethod::Bicubic, "Bicubic")
+ ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary search")
->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly)
->Attribute(Edit::Attributes::Visibility, &AreaLightComponentConfig::SupportsShadows)
->Attribute(Edit::Attributes::ReadOnly, &AreaLightComponentConfig::IsShadowPcfDisabled);
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp
index 35c5522c4e..a40557f2f1 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp
@@ -163,10 +163,10 @@ namespace AZ
->DataElement(
Edit::UIHandlers::ComboBox, &DirectionalLightComponentConfig::m_pcfMethod, "Pcf Method",
"Type of Pcf to use.\n"
- " Boundary search: do several taps to first determine if we are on a shadow boundary\n"
- " Bicubic: a smooth, fixed-size kernel \n")
- ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary Search")
+ " Bicubic: a smooth, fixed-size kernel \n"
+ " Boundary search: do several taps to first determine if we are on a shadow boundary\n")
->EnumAttribute(PcfMethod::Bicubic, "Bicubic")
+ ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary Search")
->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly)
->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsShadowPcfDisabled);
;
From bcea9f29a82eadf15d63daaa6184744d77c308f2 Mon Sep 17 00:00:00 2001
From: mriegger
Date: Wed, 12 May 2021 22:11:49 -0700
Subject: [PATCH 032/142] Improved variable name
---
.../Assets/ShaderLib/Atom/Features/LightCulling/NVLC.azsli | 6 +++---
.../Shaders/LightCulling/LightCullingTilePrepare.azsl | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/LightCulling/NVLC.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/LightCulling/NVLC.azsli
index 8bcd21b19b..60d5bf38f2 100644
--- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/LightCulling/NVLC.azsli
+++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/LightCulling/NVLC.azsli
@@ -26,7 +26,7 @@
//
//----------------------------------------------------------------------------------
-#define Depth_to_Z(d, unprojectZ) (unprojectZ.x / (d + unprojectZ.y))
+#define DepthBufferToViewSpace(d, unprojectZ) (unprojectZ.x / (d + unprojectZ.y))
#define NVLC_MAX_POSSIBLE_LIGHTS_PER_BIN 256
@@ -187,7 +187,7 @@ float4 RemapZToUnit(float4 z, float2 minmaxz)
uint DepthSamplesToBinMask2x(float2 d, float2 minmaxz, float2 unprojectZ)
{
- float2 z = Depth_to_Z(d, unprojectZ);
+ float2 z = DepthBufferToViewSpace(d, unprojectZ);
// Tile_UnitValueToBit will convert that 0 to 1 value into 0.0 to 31.99999
float2 bit = Tile_UnitValueToBit(RemapZToUnit(z, minmaxz));
@@ -207,7 +207,7 @@ uint DepthSamplesToBinMask2x(float2 d, float2 minmaxz, float2 unprojectZ)
uint DepthSamplesToBinMask4x(float4 d, float2 minmaxz, float2 unprojectZ)
{
- float4 z = Depth_to_Z(d, unprojectZ);
+ float4 z = DepthBufferToViewSpace(d, unprojectZ);
// Tile_UnitValueToBit will convert that 0 to 1 value into 0.0 to 31.99999
float4 bit = Tile_UnitValueToBit(RemapZToUnit(z, minmaxz));
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.azsl
index fba2175c9b..a8b2ab76db 100644
--- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.azsl
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.azsl
@@ -150,7 +150,7 @@ uint ComputeTransparentBitMask(float2 minmaxZ)
return 0;
}
- float2 minmaxZ_transparent = Depth_to_Z(minmaxDepth_transparent, PassSrg::m_constantData.m_unprojectZ);
+ float2 minmaxZ_transparent = DepthBufferToViewSpace(minmaxDepth_transparent, PassSrg::m_constantData.m_unprojectZ);
float2 minmaxUnit_transparent = RemapZToUnit(minmaxZ_transparent, minmaxZ);
@@ -295,7 +295,7 @@ void MainCS(
float2 minmaxDepth_opaque = ComputeDepthMinMaxFrom2Samples(opaqueDepthSamples);
minmaxDepth_both = ExpandMinMax(minmaxDepth_opaque, minmaxDepth_transparent);
UpdateMinMaxFromAllThreads(minmaxDepth_both, minmaxDepth_transparent, isPixelOnScreen);
- minmaxDepth_both = Depth_to_Z(minmaxDepth_both, PassSrg::m_constantData.m_unprojectZ);
+ minmaxDepth_both = DepthBufferToViewSpace(minmaxDepth_both, PassSrg::m_constantData.m_unprojectZ);
// if zNear == zFar we want to map z == zNear to 0-bit, so we have to keep zNear without modifications
minmaxDepth_both.y = IncrementULP(minmaxDepth_both.y);
@@ -313,7 +313,7 @@ void MainCS(
float2 minmaxDepth_opaque = ComputeDepthMinMaxFrom4Samples(opaqueDepthSamples);
minmaxDepth_both = ExpandMinMax(minmaxDepth_opaque, minmaxDepth_transparent);
UpdateMinMaxFromAllThreads(minmaxDepth_both, minmaxDepth_transparent, isPixelOnScreen);
- minmaxDepth_both = Depth_to_Z(minmaxDepth_both, PassSrg::m_constantData.m_unprojectZ);
+ minmaxDepth_both = DepthBufferToViewSpace(minmaxDepth_both, PassSrg::m_constantData.m_unprojectZ);
// if zNear == zFar we want to map z == zNear to 0-bit, so we have to keep zNear without modifications
minmaxDepth_both.y = IncrementULP(minmaxDepth_both.y);
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 033/142] 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 68711fce7599826e3b6feacb44adc6e00dd0ce53 Mon Sep 17 00:00:00 2001
From: pereslav
Date: Thu, 13 May 2021 17:23:37 +0100
Subject: [PATCH 034/142] Added network prefab processor test
---
Gems/Multiplayer/Code/CMakeLists.txt | 47 +++++++-
Gems/Multiplayer/Code/Tests/MainTools.cpp | 55 +++++++++
.../Code/Tests/PrefabProcessingTests.cpp | 106 ++++++++++++++++++
.../Code/multiplayer_tools_tests_files.cmake | 15 +++
4 files changed, 221 insertions(+), 2 deletions(-)
create mode 100644 Gems/Multiplayer/Code/Tests/MainTools.cpp
create mode 100644 Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp
create mode 100644 Gems/Multiplayer/Code/multiplayer_tools_tests_files.cmake
diff --git a/Gems/Multiplayer/Code/CMakeLists.txt b/Gems/Multiplayer/Code/CMakeLists.txt
index 4eeee15c47..7a4eaeb014 100644
--- a/Gems/Multiplayer/Code/CMakeLists.txt
+++ b/Gems/Multiplayer/Code/CMakeLists.txt
@@ -59,6 +59,26 @@ ly_add_target(
)
if (PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_target(
+ NAME Multiplayer.Tools.Static STATIC
+ NAMESPACE Gem
+ FILES_CMAKE
+ multiplayer_tools_files.cmake
+ COMPILE_DEFINITIONS
+ PUBLIC
+ MULTIPLAYER_TOOLS
+ INCLUDE_DIRECTORIES
+ PRIVATE
+ .
+ Source
+ ${pal_source_dir}
+ PUBLIC
+ Include
+ BUILD_DEPENDENCIES
+ PUBLIC
+ AZ::AzToolsFramework
+ Gem::Multiplayer.Static
+ )
ly_add_target(
NAME Multiplayer.Tools MODULE
@@ -74,8 +94,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
Include
BUILD_DEPENDENCIES
PRIVATE
- AZ::AzToolsFramework
- Gem::Multiplayer.Static
+ Gem::Multiplayer.Tools.Static
)
ly_add_target(
@@ -145,6 +164,30 @@ if (PAL_TRAIT_BUILD_TESTS_SUPPORTED)
ly_add_googletest(
NAME Gem::Multiplayer.Tests
)
+
+ if (PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_target(
+ NAME Multiplayer.Tools.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
+ NAMESPACE Gem
+ FILES_CMAKE
+ multiplayer_tools_tests_files.cmake
+ INCLUDE_DIRECTORIES
+ PRIVATE
+ Tests
+ Source
+ .
+ BUILD_DEPENDENCIES
+ PRIVATE
+ AZ::AzTest
+ AZ::AzTestShared
+ AZ::AzToolsFrameworkTestCommon
+ Gem::Multiplayer.Tools.Static
+ )
+ ly_add_googletest(
+ NAME Gem::Multiplayer.Tools.Tests
+ )
+ endif()
+
endif()
ly_add_target(
diff --git a/Gems/Multiplayer/Code/Tests/MainTools.cpp b/Gems/Multiplayer/Code/Tests/MainTools.cpp
new file mode 100644
index 0000000000..65a1d921a9
--- /dev/null
+++ b/Gems/Multiplayer/Code/Tests/MainTools.cpp
@@ -0,0 +1,55 @@
+/*
+* 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
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace Multiplayer
+{
+ class MultiplayerToolsTestEnvironment : public AZ::Test::GemTestEnvironment
+ {
+ AZ::ComponentApplication* CreateApplicationInstance() override
+ {
+ return aznew UnitTest::ToolsTestApplication("MultiplayerToolsTest");
+ }
+
+ void AddGemsAndComponents() override
+ {
+ AZStd::vector descriptors({
+ NetBindComponent::CreateDescriptor(),
+ NetBindMarkerComponent::CreateDescriptor(),
+ NetworkSpawnableHolderComponent::CreateDescriptor()
+ });
+
+ AddComponentDescriptors(descriptors);
+ }
+ };
+} // namespace UnitTest
+
+// Required to support running integration tests with Qt
+AZTEST_EXPORT int AZ_UNIT_TEST_HOOK_NAME(int argc, char** argv)
+{
+ ::testing::InitGoogleMock(&argc, argv);
+ AzQtComponents::PrepareQtPaths();
+ QApplication app(argc, argv);
+ AZ::Test::printUnusedParametersWarning(argc, argv);
+ AZ::Test::addTestEnvironments({new Multiplayer::MultiplayerToolsTestEnvironment});
+ int result = RUN_ALL_TESTS();
+ return result;
+}
diff --git a/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp b/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp
new file mode 100644
index 0000000000..3d16d12f53
--- /dev/null
+++ b/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp
@@ -0,0 +1,106 @@
+/*
+* 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
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace UnitTest
+{
+ class PrefabProcessingTestFixture : public ::testing::Test
+ {
+ public:
+ static void ConvertEntitiesToPrefab(const AZStd::vector& entities, AzToolsFramework::Prefab::PrefabDom& prefabDom)
+ {
+ auto* prefabSystem = AZ::Interface::Get();
+ AZStd::unique_ptr sourceInstance(prefabSystem->CreatePrefab(entities, {}, "test/path"));
+ ASSERT_TRUE(sourceInstance);
+
+ auto& prefabTemplateDom = prefabSystem->FindTemplateDom(sourceInstance->GetTemplateId());
+ prefabDom.CopyFrom(prefabTemplateDom, prefabDom.GetAllocator());
+ }
+
+ static AZ::Entity* CreateSourceEntity(const char* name, bool networked, const AZ::Transform& tm, AZ::Entity* parent = nullptr)
+ {
+ AZ::Entity* entity = aznew AZ::Entity(name);
+ auto* transformComponent = entity->CreateComponent();
+
+ if (parent)
+ {
+ transformComponent->SetParent(parent->GetId());
+ transformComponent->SetLocalTM(tm);
+ }
+ else
+ {
+ transformComponent->SetWorldTM(tm);
+ }
+
+ if(networked)
+ {
+ entity->CreateComponent();
+ }
+
+ return entity;
+ }
+ };
+
+ TEST_F(PrefabProcessingTestFixture, NetworkPrefabProcessor_ProcessPrefabTwoEntities_NetEntityGoesToNetSpawnable)
+ {
+ using AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext;
+
+ AZStd::vector entities;
+
+ const AZStd::string staticEntityName = "static_floor";
+ entities.emplace_back(CreateSourceEntity(staticEntityName.c_str(), false, AZ::Transform::CreateIdentity()));
+
+ const AZStd::string netEntityName = "networked_entity";
+ entities.emplace_back(CreateSourceEntity(netEntityName.c_str(), true, AZ::Transform::CreateIdentity()));
+
+ AzToolsFramework::Prefab::PrefabDom prefabDom;
+ ConvertEntitiesToPrefab(entities, prefabDom);
+
+ const AZStd::string prefabName = "testPrefab";
+ PrefabProcessorContext prefabProcessorContext{AZ::Uuid::CreateRandom()};
+ prefabProcessorContext.AddPrefab(prefabName, AZStd::move(prefabDom));
+
+ Multiplayer::NetworkPrefabProcessor processor;
+ processor.Process(prefabProcessorContext);
+
+ EXPECT_TRUE(prefabProcessorContext.HasCompletedSuccessfully());
+
+ const auto& processedObjects = prefabProcessorContext.GetProcessedObjects();
+ EXPECT_EQ(processedObjects.size(), 1);
+
+ const AZ::Data::AssetData& spawnableAsset = processedObjects[0].GetAsset();
+ EXPECT_EQ(prefabName + ".network.spawnable", processedObjects[0].GetId());
+ EXPECT_EQ(spawnableAsset.GetType(), azrtti_typeid());
+
+ const AzFramework::Spawnable* netSpawnable = azrtti_cast(&spawnableAsset);
+ const AzFramework::Spawnable::EntityList& entityList = netSpawnable->GetEntities();
+ auto countEntityCallback = [](const auto& name)
+ {
+ return [name](const auto& entity)
+ {
+ return entity->GetName() == name;
+ };
+ };
+
+ EXPECT_EQ(0, AZStd::count_if(entityList.begin(), entityList.end(), countEntityCallback(staticEntityName)));
+ EXPECT_EQ(1, AZStd::count_if(entityList.begin(), entityList.end(), countEntityCallback(netEntityName)));
+ }
+
+} // namespace UnitTest
diff --git a/Gems/Multiplayer/Code/multiplayer_tools_tests_files.cmake b/Gems/Multiplayer/Code/multiplayer_tools_tests_files.cmake
new file mode 100644
index 0000000000..c308b3de52
--- /dev/null
+++ b/Gems/Multiplayer/Code/multiplayer_tools_tests_files.cmake
@@ -0,0 +1,15 @@
+#
+# 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.
+#
+
+set(FILES
+ Tests/MainTools.cpp
+ Tests/PrefabProcessingTests.cpp
+)
From fdc890b0fc693c636559a4c0b900658cbd7f55b5 Mon Sep 17 00:00:00 2001
From: pereslav
Date: Thu, 13 May 2021 17:27:23 +0100
Subject: [PATCH 035/142] Added comments to the test
---
Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp b/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp
index 3d16d12f53..df1da11725 100644
--- a/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp
+++ b/Gems/Multiplayer/Code/Tests/PrefabProcessingTests.cpp
@@ -64,31 +64,39 @@ namespace UnitTest
AZStd::vector entities;
+ // Create test entities: 1 networked and 1 static
const AZStd::string staticEntityName = "static_floor";
entities.emplace_back(CreateSourceEntity(staticEntityName.c_str(), false, AZ::Transform::CreateIdentity()));
const AZStd::string netEntityName = "networked_entity";
entities.emplace_back(CreateSourceEntity(netEntityName.c_str(), true, AZ::Transform::CreateIdentity()));
+ // Convert the entities into prefab. Note: This will transfer the ownership of AZ::Entity* into Prefab
AzToolsFramework::Prefab::PrefabDom prefabDom;
ConvertEntitiesToPrefab(entities, prefabDom);
+ // Add the prefab into the Prefab Processor Context
const AZStd::string prefabName = "testPrefab";
PrefabProcessorContext prefabProcessorContext{AZ::Uuid::CreateRandom()};
prefabProcessorContext.AddPrefab(prefabName, AZStd::move(prefabDom));
+ // Request NetworkPrefabProcessor to process the prefab
Multiplayer::NetworkPrefabProcessor processor;
processor.Process(prefabProcessorContext);
+ // Validate results
EXPECT_TRUE(prefabProcessorContext.HasCompletedSuccessfully());
+ // Should be 1 networked spawnable
const auto& processedObjects = prefabProcessorContext.GetProcessedObjects();
EXPECT_EQ(processedObjects.size(), 1);
+ // Verify the name and the type of the spawnable asset
const AZ::Data::AssetData& spawnableAsset = processedObjects[0].GetAsset();
EXPECT_EQ(prefabName + ".network.spawnable", processedObjects[0].GetId());
EXPECT_EQ(spawnableAsset.GetType(), azrtti_typeid());
+ // Verify we have only the networked entity in the network spawnable and not the static one
const AzFramework::Spawnable* netSpawnable = azrtti_cast(&spawnableAsset);
const AzFramework::Spawnable::EntityList& entityList = netSpawnable->GetEntities();
auto countEntityCallback = [](const auto& name)
From 06682d66c1239f58d21590d46ff5ffa847eff841 Mon Sep 17 00:00:00 2001
From: gallowj
Date: Fri, 30 Apr 2021 15:19:30 -0500
Subject: [PATCH 036/142] update LFS rules with changes from 1.0
---
.gitattributes | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.gitattributes b/.gitattributes
index 1755def66a..a1609961a4 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -117,3 +117,5 @@
*.wem filter=lfs diff=lfs merge=lfs -text
*.wxs filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
+*.tbscene filter=lfs diff=lfs merge=lfs -text
+*.spp filter=lfs diff=lfs merge=lfs -text
From 42d47ca5fcb1c2e8775a389b1b4d96d098abea6e Mon Sep 17 00:00:00 2001
From: gallowj
Date: Fri, 30 Apr 2021 14:07:48 -0500
Subject: [PATCH 037/142] New geometry and texture replacement for the
Standford Lucy assets.
---
.gitattributes | 6 ++++
.../Objects/Lucy/.wip/Brass/brass_bake.spp | 3 ++
.../Lucy/.wip/Brass/low_Default_BaseColor.png | 3 ++
.../Lucy/.wip/Brass/low_Default_Metallic.png | 3 ++
.../Lucy/.wip/Brass/low_Default_Roughness.png | 3 ++
.../Objects/Lucy/.wip/bake_channels.psd | 3 ++
.../Assets/Objects/Lucy/.wip/high.fbx | 3 ++
.../Assets/Objects/Lucy/.wip/low.fbx | 3 ++
.../Objects/Lucy/.wip/marmoset_bake.tbscene | 3 ++
.../Lucy/.wip/stone/low_Default_BaseColor.png | 3 ++
.../Objects/Lucy/.wip/stone/stone_bake.spp | 3 ++
.../Assets/Objects/Lucy/Lucy_Curvature.tif | 3 ++
.../Assets/Objects/Lucy/Lucy_High.fbx | 4 +--
.../Assets/Objects/Lucy/Lucy_Normal.png | 3 ++
.../Objects/Lucy/Lucy_Stone_BaseColor.png | 3 ++
.../Assets/Objects/Lucy/Lucy_ao.tif | 4 +--
.../Objects/Lucy/Lucy_brass_baseColor.tif | 3 --
.../Assets/Objects/Lucy/Lucy_brass_cavity.tif | 3 ++
.../Objects/Lucy/Lucy_brass_metalness.tif | 3 --
.../Objects/Lucy/Lucy_brass_roughness.tif | 3 --
.../Objects/Lucy/Lucy_bronze_BaseColor.png | 3 ++
.../Objects/Lucy/Lucy_bronze_Metallic.png | 3 ++
.../Objects/Lucy/Lucy_bronze_Roughness.png | 3 ++
.../Assets/Objects/Lucy/Lucy_convexity.tif | 3 ++
.../Assets/Objects/Lucy/Lucy_low.fbx | 4 +--
.../Assets/Objects/Lucy/Lucy_normal.tif | 3 --
.../Objects/Lucy/Lucy_stone_baseColor.tif | 3 --
.../Objects/Lucy/Lucy_stone_roughness.tif | 3 --
.../Assets/Objects/Lucy/Lucy_thickness.tif | 4 +--
.../Assets/Objects/Lucy/lucy_brass.material | 20 +++++++----
.../Assets/Objects/Lucy/lucy_stone.material | 34 +++++++++++++++----
31 files changed, 109 insertions(+), 39 deletions(-)
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/brass_bake.spp
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_BaseColor.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Metallic.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Roughness.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/bake_channels.psd
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/high.fbx
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/low.fbx
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/marmoset_bake.tbscene
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/low_Default_BaseColor.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/stone_bake.spp
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Curvature.tif
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Normal.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Stone_BaseColor.png
delete mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_baseColor.tif
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_cavity.tif
delete mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_metalness.tif
delete mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_roughness.tif
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_BaseColor.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Metallic.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Roughness.png
create mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_convexity.tif
delete mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_normal.tif
delete mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_baseColor.tif
delete mode 100644 Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_roughness.tif
diff --git a/.gitattributes b/.gitattributes
index a1609961a4..d7f9d36c50 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -119,3 +119,9 @@
*.zip filter=lfs diff=lfs merge=lfs -text
*.tbscene filter=lfs diff=lfs merge=lfs -text
*.spp filter=lfs diff=lfs merge=lfs -text
+Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Hermanubis.fbx filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_High.fbx filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_low.fbx filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/marmoset_bake.tbscene filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/brass_bake.spp filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/stone_bake.spp filter=lfs diff=lfs merge=lfs -text
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/brass_bake.spp b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/brass_bake.spp
new file mode 100644
index 0000000000..0252c59ba2
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/brass_bake.spp
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb8c1839f46df4623818bc1b02f626d85d8f83d77cbeabd0d56c6a5c997c3ab3
+size 495250984
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_BaseColor.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_BaseColor.png
new file mode 100644
index 0000000000..7cbf4b4c23
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_BaseColor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9bb547a502aa028624e3f95491d2e459860db5fdc5551eece757c271362c902d
+size 42981863
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Metallic.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Metallic.png
new file mode 100644
index 0000000000..93d17390aa
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Metallic.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:962248929564f7a3a2a25813ba8ab83d72f2f4d8db71eb495bd650ad4eca5c25
+size 8681159
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Roughness.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Roughness.png
new file mode 100644
index 0000000000..2d971c65ed
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/low_Default_Roughness.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c5998edda6eb34ace8b7a5f63e72f922e0daebb6aeb453142b31e605157736d
+size 17366289
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/bake_channels.psd b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/bake_channels.psd
new file mode 100644
index 0000000000..bfa8911b3f
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/bake_channels.psd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a79b82df3f6f908b2ed31f9247d9befde7daf0ff53c87479920c0463cc12d437
+size 1308624196
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/high.fbx b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/high.fbx
new file mode 100644
index 0000000000..fc13f2345c
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/high.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b9892d5de71db58217f9c942f542c058891ab2f0949443c48111aa71fe621cae
+size 128078160
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/low.fbx b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/low.fbx
new file mode 100644
index 0000000000..a72ddaec16
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/low.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:353ff22364447796ec01799a16e6ee39fbcde337a5fee4de409069316eccbb8f
+size 6942256
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/marmoset_bake.tbscene b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/marmoset_bake.tbscene
new file mode 100644
index 0000000000..1b7605ff10
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/marmoset_bake.tbscene
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e934a8772f33e6c7bc11e70071c5d14147d01d123a5bed3bd51fc861047f17cb
+size 305364828
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/low_Default_BaseColor.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/low_Default_BaseColor.png
new file mode 100644
index 0000000000..c880cef561
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/low_Default_BaseColor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:247402172cb0539faaae937659507bd72087e629004e3eb2e8f67df97063a92f
+size 70531613
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/stone_bake.spp b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/stone_bake.spp
new file mode 100644
index 0000000000..a8249fbc6b
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/stone_bake.spp
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aa4f9fbb9fc332fa0fb3f35df3b21ef72439073a854ad55d637efbed89ad3b3c
+size 562609478
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Curvature.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Curvature.tif
new file mode 100644
index 0000000000..78074d3062
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Curvature.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f5a6f8d7abb7c7283c921d884be51addd99526fefd8c12c733d2e955b2f09f5
+size 26738740
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_High.fbx b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_High.fbx
index 0080d09b92..b87971bf6d 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_High.fbx
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_High.fbx
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b3309c06243a350db3d7c014199febe13738d1b6bdc317ad39b0da3bff6a3e0e
-size 80075536
+oid sha256:00e19e317613be5420fd78bac1159e66d1c4deeb1f32cd4fc8c20b1ea3a5ead1
+size 153114272
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Normal.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Normal.png
new file mode 100644
index 0000000000..48c7a521fd
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Normal.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c3546ce54290269e76d0badfbf950416267681e50f215a2e32304bc2f18a1bed
+size 50268306
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Stone_BaseColor.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Stone_BaseColor.png
new file mode 100644
index 0000000000..5be5669778
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_Stone_BaseColor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4fb55f2aafa1a9fe59a57f29d8b932903b23d3e3f5aec85ed7e15e27c25372e1
+size 70201185
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_ao.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_ao.tif
index c3837c208a..806d4bcd4b 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_ao.tif
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_ao.tif
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ef602929d38aab39bba40219bd91648525859e305fc18081ebed6e47827bc08e
-size 8566220
+oid sha256:73d77c42b909ac5e604e132b563d30f137c9f37ec3911ea6bc6620e7d7c2e0f9
+size 18394400
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_baseColor.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_baseColor.tif
deleted file mode 100644
index a660f821d8..0000000000
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_baseColor.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:672847ea616ac03f6d379abfe95ffc798a15afe28f8f4a8ae35b65b3de5ffed0
-size 263620560
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_cavity.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_cavity.tif
new file mode 100644
index 0000000000..d98b06d528
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_cavity.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7aa6aa6585dd07ac400bb14555761af5ba9491bf23a55dde3b3326ab92e306d1
+size 11185760
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_metalness.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_metalness.tif
deleted file mode 100644
index 42dd9adafc..0000000000
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_metalness.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:297146c0e20e8ab3c4c97be033fd67bc73a859a5fc999510ea615cc0512a0bb2
-size 246503792
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_roughness.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_roughness.tif
deleted file mode 100644
index dfea22ed23..0000000000
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_brass_roughness.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2dfa09806f9cdf5da07d517f2a3b779bfc8455fab98663ba8b414aed42869f81
-size 13010716
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_BaseColor.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_BaseColor.png
new file mode 100644
index 0000000000..2f5feac069
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_BaseColor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4999b4a1e5067d336e08c37e4e5033cca6f1f18a7497ae5dc192572a543006c9
+size 36345892
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Metallic.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Metallic.png
new file mode 100644
index 0000000000..af09391201
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Metallic.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1205e13d63f9d9b23b145eaac8d3ee7dce661dad200a6a1d49202f3794f0245a
+size 8265775
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Roughness.png b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Roughness.png
new file mode 100644
index 0000000000..67bdb35f52
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_bronze_Roughness.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:334196335ea72ea1ded2f5bf0741707b528cc9a168ff0a5a3d9afe14323a9f9b
+size 15127806
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_convexity.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_convexity.tif
new file mode 100644
index 0000000000..d57ac67c7d
--- /dev/null
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_convexity.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:978d846de424f74ad76a89c005a91780afe5bdda1b4995567b1459e23627b6f2
+size 19169668
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_low.fbx b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_low.fbx
index 37e589872b..46f5d1cfbd 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_low.fbx
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_low.fbx
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c14e8abce725d8b3e1c5e2d5b2583b25eefe2a89193bce1e79b52b9f9ba8f328
-size 10921360
+oid sha256:6a4a65d139a6088dd4ac34f3ba3f6a7a98b8fe9545150ee7d9879fbc2a55d8d4
+size 9022128
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_normal.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_normal.tif
deleted file mode 100644
index 9174f763ff..0000000000
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_normal.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:943db0650738003073c37fd0f89863e513d4db87b958b444afafa3d229c4fa19
-size 38474832
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_baseColor.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_baseColor.tif
deleted file mode 100644
index e173f81867..0000000000
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_baseColor.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:03b50a97b91659b9b667ad1978d52b936425e41be1556f995a27cc695487b998
-size 21857796
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_roughness.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_roughness.tif
deleted file mode 100644
index ec9c98e162..0000000000
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_stone_roughness.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:577e06f57c691f9c3be38c7430ef3f4a37a183e6a1e2086e2a6aefffc7c045a2
-size 12055428
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_thickness.tif b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_thickness.tif
index 6d4672599c..1c835e2355 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_thickness.tif
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_thickness.tif
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2fb9d31cbee218d59f27c1e71c2e44f1316e6876ec327aa4971694eec3b82b8c
-size 18596496
+oid sha256:5ba4c5e434d121d517605cdff972bfba024cf4b3065bc753bb46c7be33dcd67f
+size 28629316
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
index 58f195e78b..8aa1f103d5 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
@@ -5,7 +5,8 @@
"propertyLayoutVersion": 3,
"properties": {
"occlusion": {
- "diffuseTextureMap": "Objects/Lucy/Lucy_ao.tif"
+ "textureMap": "Objects/Lucy/Lucy_ao.tif"
+ "textureMapUv": "Unwrapped"
},
"baseColor": {
"color": [
@@ -16,18 +17,25 @@
],
"factor": 1.0,
"textureBlendMode": "Lerp",
- "textureMap": "Objects/Lucy/Lucy_brass_baseColor.tif"
+ "textureMap": "Objects/Lucy/Lucy_bronzet_BaseColor.png",
+ "textureMapUv": "Unwrapped"
+ },
+ "general": {
+ "applySpecularAA": true
},
"metallic": {
- "textureMap": "Objects/Lucy/Lucy_brass_metalness.tif"
+ "textureMap": "Objects/Lucy/Lucy_bronze_Metallic.png",
+ "textureMapUv": "Unwrapped"
},
"normal": {
"flipY": true,
- "textureMap": "Objects/Lucy/Lucy_normal.tif"
+ "textureMap": "Objects/Lucy/Lucy_Normal.png",
+ "textureMapUv": "Unwrapped"
},
"roughness": {
- "upperBound": 0.6767677068710327,
- "textureMap": "Objects/Lucy/Lucy_brass_roughness.tif"
+ "textureMap": "Objects/Lucy/Lucy_bronze_Roughness.png",
+ "textureMapUv": "Unwrapped",
+ "upperBound": 0.6767677068710327
}
}
}
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material
index 1ed516a864..b34bd92506 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material
@@ -5,29 +5,49 @@
"propertyLayoutVersion": 3,
"properties": {
"occlusion": {
- "diffuseTextureMap": "Objects/Lucy/Lucy_ao.tif"
+ "textureMap": "Objects/Lucy/Lucy_ao.tif"
+ "textureMapUv": "Unwrapped"
},
"baseColor": {
"color": [
- 0.6745098233222961,
- 0.48627451062202456,
- 0.19607843458652497,
+ 1.0,
+ 1.0,
+ 1.0,
1.0
],
"factor": 1.0,
"textureBlendMode": "Lerp",
- "textureMap": "Objects/Lucy/Lucy_stone_baseColor.tif"
+ "textureMap": "Objects/Lucy/Lucy_Stone_BaseColor.png",
+ "textureMapUv": "Unwrapped"
+ },
+ "clearCoat": {
+ "roughness": 0.10000000149011612
+ },
+ "general": {
+ "applySpecularAA": true
+ },
+ "irradiance": {
+ "color": [
+ 0.7304646372795105,
+ 0.6938735246658325,
+ 0.6866865158081055,
+ 1.0
+ ]
},
"metallic": {
"factor": 0.0
},
"normal": {
"flipY": true,
- "textureMap": "Objects/Lucy/Lucy_normal.tif"
+ "textureMap": "Objects/Lucy/Lucy_Normal.png",
+ "textureMapUv": "Unwrapped"
},
"roughness": {
"factor": 1.0,
- "textureMap": "Objects/Lucy/Lucy_stone_roughness.tif"
+ "lowerBound": 0.15000000596046449,
+ "textureMap": "Objects/Lucy/Lucy_bronze_Roughness.png",
+ "textureMapUv": "Unwrapped",
+ "upperBound": 0.7300000190734863
}
}
}
From 49084d250ffc9b14bd60e1e35f869b94237bacde Mon Sep 17 00:00:00 2001
From: gallowj
Date: Thu, 13 May 2021 16:40:51 -0500
Subject: [PATCH 038/142] updating material files
---
.../CommonFeatures/Assets/Objects/Lucy/lucy_brass.material | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
index 8aa1f103d5..943079f491 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
@@ -17,7 +17,7 @@
],
"factor": 1.0,
"textureBlendMode": "Lerp",
- "textureMap": "Objects/Lucy/Lucy_bronzet_BaseColor.png",
+ "textureMap": "Objects/Lucy/Lucy_bronze_BaseColor.png",
"textureMapUv": "Unwrapped"
},
"general": {
From 183790bf7948059e79ed6b7f07745230864b9bea Mon Sep 17 00:00:00 2001
From: gallowj
Date: Thu, 13 May 2021 16:41:32 -0500
Subject: [PATCH 039/142] materials need properties updated to match changes
with standardpbr materialType
---
.../CommonFeatures/Assets/Objects/Lucy/lucy_brass.material | 6 +++---
.../CommonFeatures/Assets/Objects/Lucy/lucy_stone.material | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
index 943079f491..6e490cb0b1 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material
@@ -5,8 +5,8 @@
"propertyLayoutVersion": 3,
"properties": {
"occlusion": {
- "textureMap": "Objects/Lucy/Lucy_ao.tif"
- "textureMapUv": "Unwrapped"
+ "diffuseTextureMap": "Objects/Lucy/Lucy_ao.tif",
+ "diffuseTextureMapUv": "Unwrapped"
},
"baseColor": {
"color": [
@@ -38,4 +38,4 @@
"upperBound": 0.6767677068710327
}
}
-}
+}
\ No newline at end of file
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material
index b34bd92506..a0e54d9d0e 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material
+++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material
@@ -5,8 +5,8 @@
"propertyLayoutVersion": 3,
"properties": {
"occlusion": {
- "textureMap": "Objects/Lucy/Lucy_ao.tif"
- "textureMapUv": "Unwrapped"
+ "diffuseTextureMap": "Objects/Lucy/Lucy_ao.tif",
+ "diffuseTextureMapUv": "Unwrapped"
},
"baseColor": {
"color": [
@@ -50,4 +50,4 @@
"upperBound": 0.7300000190734863
}
}
-}
+}
\ No newline at end of file
From 6b8b953c63f23536bb89cfa198ad58a3001f50b3 Mon Sep 17 00:00:00 2001
From: gallowj
Date: Thu, 29 Apr 2021 20:51:42 -0500
Subject: [PATCH 040/142] Replaced Lucy with new geometry
---
.../MaterialEditor/ViewportModels/Lucy.fbx | Bin 133 -> 9021888 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.fbx
index d16c98530c06aca7508eeb888efe201b309fdb9c..534f5a2cdfbf8ecf7e3dc9623ca5fc49ef4c5c1d 100644
GIT binary patch
literal 9021888
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