From 808fd1d3ba2843a2e0e19205726f4ca957e5fcd8 Mon Sep 17 00:00:00 2001 From: moraaar Date: Fri, 16 Apr 2021 18:24:29 +0100 Subject: [PATCH 01/10] Cloth works with Actors in Atom. Cloth system uses MeshAssetHelper to read model mesh information for actors too. --- .../Code/Source/AtomActorInstance.cpp | 48 +++++++------------ .../Code/Source/AtomActorInstance.h | 9 ---- .../ClothComponentMesh/ClothComponentMesh.cpp | 15 ++++-- .../NvCloth/Code/Source/Utils/AssetHelper.cpp | 26 ++-------- .../Code/Source/Utils/MeshAssetHelper.cpp | 6 +++ .../Code/Source/Utils/MeshAssetHelper.h | 4 +- 6 files changed, 41 insertions(+), 67 deletions(-) diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp index 0a17a6444d..cd5f3bb6c5 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp @@ -212,19 +212,26 @@ namespace AZ void AtomActorInstance::SetModelAsset([[maybe_unused]] Data::Asset modelAsset) { - // Atom Actor Instance is not based on an actual Model Asset yet, - // it's created at runtime from an Actor Asset. + // Changing model asset is not supported by Atom Actor Instance. + // The model asset is obtained from the Actor inside the ActorAsset, + // which is passed to the constructor. To set a different model asset + // this instance should use a different Actor. + AZ_Assert(false, "AtomActorInstance::SetModelAsset not supported"); } const Data::Asset& AtomActorInstance::GetModelAsset() const { - return m_skinnedMeshInstance->m_model->GetModelAsset(); + AZ_Assert(GetActor(), "Expecting a Atom Actor Instance having a valid Actor."); + return GetActor()->GetMeshAsset(); } void AtomActorInstance::SetModelAssetId([[maybe_unused]] Data::AssetId modelAssetId) { - // Atom Actor Instance is not based on an actual Model Asset yet, - // it's created at runtime from an Actor Asset. + // Changing model asset is not supported by Atom Actor Instance. + // The model asset is obtained from the Actor inside the ActorAsset, + // which is passed to the constructor. To set a different model asset + // this instance should use a different Actor. + AZ_Assert(false, "AtomActorInstance::SetModelAssetId not supported"); } Data::AssetId AtomActorInstance::GetModelAssetId() const @@ -234,8 +241,11 @@ namespace AZ void AtomActorInstance::SetModelAssetPath([[maybe_unused]] const AZStd::string& modelAssetPath) { - // Atom Actor Instance is not based on an actual Model Asset yet, - // it's created at runtime from an Actor Asset. + // Changing model asset is not supported by Atom Actor Instance. + // The model asset is obtained from the Actor inside the ActorAsset, + // which is passed to the constructor. To set a different model asset + // this instance should use a different Actor. + AZ_Assert(false, "AtomActorInstance::SetModelAssetPath not supported"); } AZStd::string AtomActorInstance::GetModelAssetPath() const @@ -278,28 +288,6 @@ namespace AZ return IsVisible(); } - void AtomActorInstance::SetMeshAsset(const AZ::Data::AssetId& id) - { - AZ::Data::Asset asset = - AZ::Data::AssetManager::Instance().GetAsset( - id, m_actorAsset.GetAutoLoadBehavior()); - if (asset) - { - m_actorAsset = asset; - Create(); - } - } - - AZ::Data::Asset AtomActorInstance::GetMeshAsset() - { - return m_actorAsset; - } - - bool AtomActorInstance::GetVisibility() - { - return static_cast(*this).GetVisibility(); - } - AZ::u32 AtomActorInstance::GetJointCount() { return m_actorInstance->GetActor()->GetSkeleton()->GetNumNodes(); @@ -469,7 +457,6 @@ namespace AZ TransformNotificationBus::Handler::BusConnect(m_entityId); MaterialComponentNotificationBus::Handler::BusConnect(m_entityId); MeshComponentRequestBus::Handler::BusConnect(m_entityId); - LmbrCentral::MeshComponentRequestBus::Handler::BusConnect(m_entityId); const Data::Instance model = m_meshFeatureProcessor->GetModel(*m_meshHandle); MeshComponentNotificationBus::Event(m_entityId, &MeshComponentNotificationBus::Events::OnModelReady, model->GetModelAsset(), model); @@ -479,7 +466,6 @@ namespace AZ { MeshComponentNotificationBus::Event(m_entityId, &MeshComponentNotificationBus::Events::OnModelPreDestroy); - LmbrCentral::MeshComponentRequestBus::Handler::BusDisconnect(); MeshComponentRequestBus::Handler::BusDisconnect(); MaterialComponentNotificationBus::Handler::BusDisconnect(); TransformNotificationBus::Handler::BusDisconnect(); diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h index e14a0a7c4f..a2cf042efa 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h @@ -62,7 +62,6 @@ namespace AZ , public AzFramework::BoundsRequestBus::Handler , public AZ::Render::MaterialComponentNotificationBus::Handler , public AZ::Render::MeshComponentRequestBus::Handler - , public LmbrCentral::MeshComponentRequestBus::Handler , private AZ::Render::SkinnedMeshFeatureProcessorNotificationBus::Handler , private AZ::Render::SkinnedMeshOutputStreamNotificationBus::Handler , private LmbrCentral::SkeletalHierarchyRequestBus::Handler @@ -143,14 +142,6 @@ namespace AZ bool GetVisibility() const override; // GetWorldBounds/GetLocalBounds already overridden by BoundsRequestBus::Handler - ////////////////////////////////////////////////////////////////////////// - // LmbrCentral::MeshComponentRequestBus::Handler - void SetMeshAsset(const AZ::Data::AssetId& id) override; - AZ::Data::Asset GetMeshAsset() override; - bool GetVisibility() override; - // SetVisibility already overridden by MeshComponentRequestBus::Handler - // GetWorldBounds/GetLocalBounds already overridden by BoundsRequestBus::Handler - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SkeletalHierarchyRequestBus::Handler overrides... AZ::u32 GetJointCount() override; diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp index cf2593048f..92dbfdb89a 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp @@ -448,9 +448,18 @@ namespace NvCloth const auto& renderTangents = renderData.m_tangents; const auto& renderBitangents = renderData.m_bitangents; - AZ::Data::Asset modelAsset; - AZ::Render::MeshComponentRequestBus::EventResult( - modelAsset, m_entityId, &AZ::Render::MeshComponentRequestBus::Events::GetModelAsset); + // Since Atom has a 1:1 relation with between ModelAsset buffers and Model buffers, + // internally it created a new asset for the model instance. So it's important to + // get the asset from the model when we want to write to them, instead of getting the + // ModelAsset directly from the bus (which returns the original asset shared by all entities). + AZ::Data::Instance model; + AZ::Render::MeshComponentRequestBus::EventResult(model, m_entityId, &AZ::Render::MeshComponentRequestBus::Events::GetModel); + if (!model) + { + return; + } + + AZ::Data::Asset modelAsset = model->GetModelAsset(); if (!modelAsset.IsReady()) { return; diff --git a/Gems/NvCloth/Code/Source/Utils/AssetHelper.cpp b/Gems/NvCloth/Code/Source/Utils/AssetHelper.cpp index cb4d644065..c7558580b3 100644 --- a/Gems/NvCloth/Code/Source/Utils/AssetHelper.cpp +++ b/Gems/NvCloth/Code/Source/Utils/AssetHelper.cpp @@ -13,11 +13,7 @@ #include #include -#include -#include - -#include namespace NvCloth { @@ -30,25 +26,9 @@ namespace NvCloth AZStd::unique_ptr AssetHelper::CreateAssetHelper(AZ::EntityId entityId) { - // Does the entity have an Actor Asset? - EMotionFX::ActorInstance* actorInstance = nullptr; - EMotionFX::Integration::ActorComponentRequestBus::EventResult( - actorInstance, entityId, &EMotionFX::Integration::ActorComponentRequestBus::Events::GetActorInstance); - if (actorInstance) - { - return AZStd::make_unique(entityId); - } - - AZ::Data::Asset modelAsset; - AZ::Render::MeshComponentRequestBus::EventResult( - modelAsset, entityId, &AZ::Render::MeshComponentRequestBus::Events::GetModelAsset); - if (modelAsset.GetId().IsValid()) - { - return AZStd::make_unique(entityId); - } - - AZ_Warning("AssetHelper", false, "Unexpected asset type"); - return nullptr; + return entityId.IsValid() + ? AZStd::make_unique(entityId) + : nullptr; } float AssetHelper::ConvertBackstopOffset(float backstopOffset) diff --git a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp index fa8d6e5455..6852d245d2 100644 --- a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp +++ b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp @@ -14,11 +14,17 @@ #include +#include + namespace NvCloth { MeshAssetHelper::MeshAssetHelper(AZ::EntityId entityId) : AssetHelper(entityId) { + EMotionFX::ActorInstance* actorInstance = nullptr; + EMotionFX::Integration::ActorComponentRequestBus::EventResult( + actorInstance, entityId, &EMotionFX::Integration::ActorComponentRequestBus::Events::GetActorInstance); + m_supportSkinnedAnimation = actorInstance != nullptr; } void MeshAssetHelper::GatherClothMeshNodes(MeshNodeList& meshNodes) diff --git a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.h b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.h index b558519bd4..a7849583e7 100644 --- a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.h +++ b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.h @@ -35,12 +35,14 @@ namespace NvCloth MeshClothInfo& meshClothInfo) override; bool DoesSupportSkinnedAnimation() const override { - return false; + return m_supportSkinnedAnimation; } private: bool CopyDataFromMeshes( const AZStd::vector& meshes, MeshClothInfo& meshClothInfo); + + bool m_supportSkinnedAnimation = false; }; } // namespace NvCloth From 9e6a5ecbaf3e8619bffd11f2d4944145a42560cf Mon Sep 17 00:00:00 2001 From: moraaar Date: Fri, 16 Apr 2021 18:25:24 +0100 Subject: [PATCH 02/10] Fix cloth chicken actor asset in NvCloth gem. --- .../cloth/Chicken/Actor/chicken.fbx.assetinfo | 534 ++++++------------ 1 file changed, 172 insertions(+), 362 deletions(-) diff --git a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo index 808b024189..a6024e0c5f 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo @@ -1,362 +1,172 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "ActorGroup", + "name": "chicken", + "id": "{C086F309-EE7E-5AFD-A9C2-69DE5BA48461}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"chicken\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "clothConfig": { + "nodes": [ + { + "name": "def_c_head_joint", + "shapes": [ + [ + { + "Visible": true, + "Position": [ + -0.08505599945783615, + 0.0, + 0.009370899759232998 + ], + "Rotation": [ + 0.7071437239646912, + 0.0, + 0.0, + 0.708984375 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.191273495554924, + "Radius": 0.05063670128583908 + } + ] + ] + }, + { + "name": "def_c_neck_joint", + "shapes": [ + [ + { + "Visible": true, + "Position": [ + -0.03810190036892891, + 0.0, + -0.03132440149784088 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.16069939732551576 + } + ] + ] + }, + { + "name": "def_c_spine_end", + "shapes": [ + [ + { + "Visible": true, + "Position": [ + -2.0000000233721949e-7, + 0.012646200135350228, + -0.24104370176792146 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.24875959753990174 + } + ] + ] + } + ] + } + } + } + }, + { + "$type": "CoordinateSystemRule" + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "chicken", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.chicken_skeleton", + "RootNode.chicken_feet_skin", + "RootNode.chicken_eyes_skin", + "RootNode.chicken_body_skin", + "RootNode.chicken_mohawk", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.def_l_foot_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.def_r_foot_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_tail1_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.def_l_wing2_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.def_r_wing2_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.def_l_foot_joint.def_l_ball_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.def_r_foot_joint.def_r_ball_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_tail1_joint.def_c_tail2_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.def_l_wing2_joint.def_l_wing_end", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.def_r_wing2_joint.def_r_wing_end", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_mouth_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_mouth_joint.def_c_mouth_end", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.def_c_waddle3_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.def_c_waddle3_joint.def_c_waddle_end", + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint.def_c_feather_end" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Disabled" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "CoordinateSystemRule" + }, + { + "$type": "ClothRule", + "meshNodeName": "RootNode.chicken_mohawk", + "inverseMassesStreamName": "colorSet1", + "motionConstraintsStreamName": "Default: 1.0", + "backstopStreamName": "None" + } + ] + }, + "id": "{55E26F74-B35F-4BC1-87BB-83E3DE85C346}" + } + ] +} \ No newline at end of file From 4b3662ac0a47cb6e962653e3acd838183c701eed Mon Sep 17 00:00:00 2001 From: moraaar Date: Fri, 16 Apr 2021 18:26:17 +0100 Subject: [PATCH 03/10] Sort out cloth tests after Actors work with model mesh assets. --- .../ActorClothCollidersTest.cpp | 10 ++-- .../ClothComponentMeshTest.cpp | 28 ++++++++--- .../Components/EditorClothComponentTest.cpp | 20 ++++---- Gems/NvCloth/Code/Tests/System/ClothTest.cpp | 2 +- .../Code/Tests/System/FabricCookerTest.cpp | 44 ++++++++-------- .../Code/Tests/Utils/ActorAssetHelperTest.cpp | 50 +++++++++++++------ 6 files changed, 96 insertions(+), 58 deletions(-) diff --git a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothCollidersTest.cpp b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothCollidersTest.cpp index 946f9e0af2..e3a321cebd 100644 --- a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothCollidersTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothCollidersTest.cpp @@ -145,8 +145,8 @@ namespace UnitTest const AZStd::vector& capsuleColliders = actorClothColliders->GetCapsuleColliders(); const AZStd::vector& nativeCapsuleIndices = actorClothColliders->GetCapsuleIndices(); - EXPECT_EQ(sphereColliders.size(), 1); - EXPECT_EQ(nativeSpheres.size(), 1); + ASSERT_EQ(sphereColliders.size(), 1); + ASSERT_EQ(nativeSpheres.size(), 1); EXPECT_TRUE(capsuleColliders.empty()); EXPECT_TRUE(nativeCapsuleIndices.empty()); @@ -189,9 +189,9 @@ namespace UnitTest const AZStd::vector& nativeCapsuleIndices = actorClothColliders->GetCapsuleIndices(); EXPECT_TRUE(sphereColliders.empty()); - EXPECT_EQ(nativeSpheres.size(), 2); // Each capsule produces 2 spheres - EXPECT_EQ(capsuleColliders.size(), 1); - EXPECT_EQ(nativeCapsuleIndices.size(), 2); // Each capsule is 2 indices + ASSERT_EQ(nativeSpheres.size(), 2); // Each capsule produces 2 spheres + ASSERT_EQ(capsuleColliders.size(), 1); + ASSERT_EQ(nativeCapsuleIndices.size(), 2); // Each capsule is 2 indices EXPECT_NEAR(capsuleColliders[0].m_height, height, Tolerance); EXPECT_NEAR(capsuleColliders[0].m_radius, radius, Tolerance); diff --git a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp index c463c30226..3d5b7713b3 100644 --- a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp @@ -144,8 +144,12 @@ namespace UnitTest EXPECT_TRUE(renderData.m_bitangents.empty()); EXPECT_TRUE(renderData.m_normals.empty()); } - - TEST_F(NvClothComponentMesh, ClothComponentMesh_InitWithEntityActorWithNoClothData_TriggersError) + + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_InitWithEntityActorWithNoClothData_TriggersError) { { auto actor = AZStd::make_unique("actor_test"); @@ -165,8 +169,12 @@ namespace UnitTest AZ_TEST_STOP_TRACE_SUPPRESSION(1); // Expect 1 error } - - TEST_F(NvClothComponentMesh, ClothComponentMesh_InitWithEntityActor_ReturnsValidRenderData) + + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_InitWithEntityActor_ReturnsValidRenderData) { { auto actor = AZStd::make_unique("actor_test"); @@ -265,7 +273,11 @@ namespace UnitTest EXPECT_TRUE(renderData.m_normals.empty()); } - TEST_F(NvClothComponentMesh, ClothComponentMesh_UpdateConfigurationDifferentEntity_ReturnsRenderDataFromNewEntity) + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_UpdateConfigurationDifferentEntity_ReturnsRenderDataFromNewEntity) { { auto actor = AZStd::make_unique("actor_test"); @@ -341,7 +353,11 @@ namespace UnitTest EXPECT_TRUE(renderData.m_normals.empty()); } - TEST_F(NvClothComponentMesh, ClothComponentMesh_UpdateConfigurationNewMeshNode_ReturnsRenderDataFromNewMeshNode) + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_UpdateConfigurationNewMeshNode_ReturnsRenderDataFromNewMeshNode) { const AZStd::string meshNode2Name = "cloth_node_2"; diff --git a/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp b/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp index bb3218a4f5..7dc191bd9a 100644 --- a/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp @@ -184,7 +184,7 @@ namespace UnitTest const NvCloth::MeshNodeList& meshNodeList = editorClothComponent->GetMeshNodeList(); - EXPECT_EQ(meshNodeList.size(), 1); + ASSERT_EQ(meshNodeList.size(), 1); EXPECT_TRUE(meshNodeList[0] == NvCloth::Internal::StatusMessageNoAsset); } @@ -208,7 +208,7 @@ namespace UnitTest const NvCloth::MeshNodeList& meshNodeList = editorClothComponent->GetMeshNodeList(); - EXPECT_EQ(meshNodeList.size(), 1); + ASSERT_EQ(meshNodeList.size(), 1); EXPECT_TRUE(meshNodeList[0] == NvCloth::Internal::StatusMessageNoClothNodes); } @@ -234,7 +234,7 @@ namespace UnitTest const NvCloth::MeshNodeList& meshNodeList = editorClothComponent->GetMeshNodeList(); - EXPECT_EQ(meshNodeList.size(), 1); + ASSERT_EQ(meshNodeList.size(), 1); EXPECT_TRUE(meshNodeList[0] == NvCloth::Internal::StatusMessageNoClothNodes); } @@ -261,7 +261,7 @@ namespace UnitTest const NvCloth::MeshNodeList& meshNodeList = editorClothComponent->GetMeshNodeList(); - EXPECT_EQ(meshNodeList.size(), 2); + ASSERT_EQ(meshNodeList.size(), 2); EXPECT_TRUE(meshNodeList[0] == NvCloth::Internal::StatusMessageSelectNode); EXPECT_TRUE(meshNodeList[1] == MeshNodeName); } @@ -322,9 +322,11 @@ namespace UnitTest EXPECT_TRUE(meshNodesWithBackstopData.find(MeshNodeName) != meshNodesWithBackstopData.end()); } - // [TODO LYN-2252] - // Enable test once OnModelDestroyed is available. - TEST_F(NvClothEditorClothComponent, DISABLED_EditorClothComponent_OnMeshDestroyed_ReturnsMeshNodeListWithNoAssetMessage) + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothEditorClothComponent, DISABLED_EditorClothComponent_OnModelPreDestroy_ReturnsMeshNodeListWithNoAssetMessage) { auto editorEntity = CreateInactiveEditorEntity("ClothComponentEditorEntity"); auto* editorClothComponent = editorEntity->CreateComponent(); @@ -341,12 +343,12 @@ namespace UnitTest editorActorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); } - //editorClothComponent->OnModelDestroyed(); + editorClothComponent->OnModelPreDestroy(); const NvCloth::MeshNodeList& meshNodeList = editorClothComponent->GetMeshNodeList(); const auto& meshNodesWithBackstopData = editorClothComponent->GetMeshNodesWithBackstopData(); - EXPECT_EQ(meshNodeList.size(), 1); + ASSERT_EQ(meshNodeList.size(), 1); EXPECT_TRUE(meshNodeList[0] == NvCloth::Internal::StatusMessageNoAsset); EXPECT_TRUE(meshNodesWithBackstopData.empty()); } diff --git a/Gems/NvCloth/Code/Tests/System/ClothTest.cpp b/Gems/NvCloth/Code/Tests/System/ClothTest.cpp index 2c3ae610e4..08959a9196 100644 --- a/Gems/NvCloth/Code/Tests/System/ClothTest.cpp +++ b/Gems/NvCloth/Code/Tests/System/ClothTest.cpp @@ -506,7 +506,7 @@ namespace UnitTest EXPECT_EQ(initialParticles.size(), nvClothCurrentParticles.size()); EXPECT_EQ(initialParticles.size(), nvClothPreviousParticles.size()); - for (size_t i = 0; i < nvClothCurrentParticles.size(); ++i) + for (size_t i = 0; i < initialParticles.size(); ++i) { ExpectEq(initialParticles[i], nvClothCurrentParticles[i]); ExpectEq(initialParticles[i], nvClothPreviousParticles[i]); diff --git a/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp b/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp index 16a5d2efa3..d2d312c2ca 100644 --- a/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp +++ b/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp @@ -283,7 +283,7 @@ namespace UnitTest AZStd::vector remappedVertices; NvCloth::Internal::WeldVertices(vertices, indices, weldedVertices, weldedIndices, remappedVertices); - EXPECT_EQ(weldedVertices.size(), expectedSizeAfterWelding); + ASSERT_EQ(weldedVertices.size(), expectedSizeAfterWelding); EXPECT_THAT(weldedVertices[0].GetAsVector3(), IsCloseTolerance(vertexPosition, Tolerance)); EXPECT_NEAR(weldedVertices[0].GetW(), lowestInverseMass, Tolerance); } @@ -307,9 +307,9 @@ namespace UnitTest AZStd::vector remappedVertices; NvCloth::Internal::WeldVertices(vertices, indices, weldedVertices, weldedIndices, remappedVertices); - EXPECT_EQ(weldedVertices.size(), expectedSizeAfterWelding); - EXPECT_EQ(weldedIndices.size(), indices.size()); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(weldedVertices.size(), expectedSizeAfterWelding); + ASSERT_EQ(weldedIndices.size(), indices.size()); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { @@ -347,9 +347,9 @@ namespace UnitTest // The result after calling WeldVertices is expected to have the same size. // The vertices inside will be reordered though due to the welding process. - EXPECT_EQ(weldedVertices.size(), vertices.size()); - EXPECT_EQ(weldedIndices.size(), indices.size()); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(weldedVertices.size(), vertices.size()); + ASSERT_EQ(weldedIndices.size(), indices.size()); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { @@ -422,9 +422,9 @@ namespace UnitTest AZStd::vector remappedVertices; NvCloth::Internal::RemoveStaticTriangles(vertices, indices, simplifiedVertices, simplifiedIndices, remappedVertices); - EXPECT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); - EXPECT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); + ASSERT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { @@ -477,9 +477,9 @@ namespace UnitTest AZStd::vector remappedVertices; NvCloth::Internal::RemoveStaticTriangles(vertices, indices, simplifiedVertices, simplifiedIndices, remappedVertices); - EXPECT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); - EXPECT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); + ASSERT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { @@ -532,9 +532,9 @@ namespace UnitTest // The result after calling RemoveStaticTriangles is expected to have the same size. // The vertices will be reordered though due to the processing during simplification. - EXPECT_EQ(simplifiedVertices.size(), vertices.size()); - EXPECT_EQ(simplifiedIndices.size(), indices.size()); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(simplifiedVertices.size(), vertices.size()); + ASSERT_EQ(simplifiedIndices.size(), indices.size()); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { @@ -576,9 +576,9 @@ namespace UnitTest AZStd::vector remappedVertices; AZ::Interface::Get()->SimplifyMesh(vertices, indices, simplifiedVertices, simplifiedIndices, remappedVertices, removeStaticTriangles); - EXPECT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); - EXPECT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); + ASSERT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { @@ -635,9 +635,9 @@ namespace UnitTest AZStd::vector remappedVertices; AZ::Interface::Get()->SimplifyMesh(vertices, indices, simplifiedVertices, simplifiedIndices, remappedVertices, removeStaticTriangles); - EXPECT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); - EXPECT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); - EXPECT_EQ(remappedVertices.size(), vertices.size()); + ASSERT_EQ(simplifiedVertices.size(), expectedVerticesSizeAfterSimplification); + ASSERT_EQ(simplifiedIndices.size(), expectedIndicesSizeAfterSimplification); + ASSERT_EQ(remappedVertices.size(), vertices.size()); for (size_t i = 0; i < remappedVertices.size(); ++i) { diff --git a/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp b/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp index 481bf70c67..de0ba9031e 100644 --- a/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp +++ b/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include @@ -24,7 +24,7 @@ namespace UnitTest { //! Fixture to setup entity with actor component and the tests data. - class NvClothActorAssetHelper + class NvClothMeshAssetHelper : public ::testing::Test { public: @@ -75,7 +75,7 @@ namespace UnitTest AZStd::unique_ptr m_entity; }; - void NvClothActorAssetHelper::SetUp() + void NvClothMeshAssetHelper::SetUp() { m_entity = AZStd::make_unique(); m_entity->CreateComponent(); @@ -84,14 +84,14 @@ namespace UnitTest m_entity->Activate(); } - void NvClothActorAssetHelper::TearDown() + void NvClothMeshAssetHelper::TearDown() { m_entity->Deactivate(); m_actorComponent = nullptr; m_entity.reset(); } - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_CreateAssetHelperWithInvalidEntityId_ReturnsNull) + TEST_F(NvClothMeshAssetHelper, MeshAssetHelper_CreateAssetHelperWithInvalidEntityId_ReturnsNull) { AZ::EntityId entityId; @@ -100,7 +100,18 @@ namespace UnitTest EXPECT_TRUE(assetHelper.get() == nullptr); } - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_CreateAssetHelperWithActor_ReturnsValidActorAssetHelper) + TEST_F(NvClothMeshAssetHelper, MeshAssetHelper_CreateAssetHelperWithValidEntityId_ReturnsValidMeshAssetHelper) + { + AZStd::unique_ptr entity = AZStd::make_unique(); + + AZStd::unique_ptr assetHelper = NvCloth::AssetHelper::CreateAssetHelper(entity->GetId()); + + EXPECT_TRUE(assetHelper.get() != nullptr); + EXPECT_TRUE(azrtti_cast(assetHelper.get()) != nullptr); + EXPECT_FALSE(assetHelper->DoesSupportSkinnedAnimation()); + } + + TEST_F(NvClothMeshAssetHelper, MeshAssetHelper_CreateAssetHelperWithActor_ReturnsValidMeshAssetHelper) { { auto actor = AZStd::make_unique("actor_test"); @@ -112,10 +123,11 @@ namespace UnitTest AZStd::unique_ptr assetHelper = NvCloth::AssetHelper::CreateAssetHelper(m_actorComponent->GetEntityId()); EXPECT_TRUE(assetHelper.get() != nullptr); - EXPECT_TRUE(azrtti_cast(assetHelper.get()) != nullptr); + EXPECT_TRUE(azrtti_cast(assetHelper.get()) != nullptr); + EXPECT_TRUE(assetHelper->DoesSupportSkinnedAnimation()); } - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_DoesSupportSkinnedAnimation_ReturnsTrue) + TEST_F(NvClothMeshAssetHelper, MeshAssetHelper_DoesSupportSkinnedAnimation_ReturnsTrue) { { auto actor = AZStd::make_unique("actor_test"); @@ -129,7 +141,7 @@ namespace UnitTest EXPECT_TRUE(assetHelper->DoesSupportSkinnedAnimation()); } - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_GatherClothMeshNodesWithEmptyActor_ReturnsEmptyInfo) + TEST_F(NvClothMeshAssetHelper, MeshAssetHelper_GatherClothMeshNodesWithEmptyActor_ReturnsEmptyInfo) { { auto actor = AZStd::make_unique("actor_test"); @@ -146,7 +158,7 @@ namespace UnitTest EXPECT_TRUE(meshNodes.empty()); } - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_ObtainClothMeshNodeInfoWithEmptyActor_ReturnsFalse) + TEST_F(NvClothMeshAssetHelper, MeshAssetHelper_ObtainClothMeshNodeInfoWithEmptyActor_ReturnsFalse) { { auto actor = AZStd::make_unique("actor_test"); @@ -164,7 +176,11 @@ namespace UnitTest EXPECT_FALSE(infoObtained); } - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_GatherClothMeshNodesWithActor_ReturnsCorrectMeshNodeList) + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothMeshAssetHelper, DISABLED_MeshAssetHelper_GatherClothMeshNodesWithActor_ReturnsCorrectMeshNodeList) { { auto actor = AZStd::make_unique("actor_test"); @@ -185,12 +201,16 @@ namespace UnitTest NvCloth::MeshNodeList meshNodes; assetHelper->GatherClothMeshNodes(meshNodes); - EXPECT_EQ(meshNodes.size(), 2); + ASSERT_EQ(meshNodes.size(), 2); EXPECT_TRUE(meshNodes[0] == MeshNode1Name); EXPECT_TRUE(meshNodes[1] == MeshNode2Name); } - - TEST_F(NvClothActorAssetHelper, ActorAssetHelper_ObtainClothMeshNodeInfoWithActor_ReturnsCorrectClothInfo) + + // [TODO LYN-1891] + // Revisit when Cloth Component Mesh works with Actors adapted to Atom models. + // Editor Cloth component now uses the new AZ::Render::MeshComponentNotificationBus::OnModelReady + // notification and this test does not setup a model yet. + TEST_F(NvClothMeshAssetHelper, DISABLED_MeshAssetHelper_ObtainClothMeshNodeInfoWithActor_ReturnsCorrectClothInfo) { { auto actor = AZStd::make_unique("actor_test"); @@ -215,7 +235,7 @@ namespace UnitTest EXPECT_TRUE(infoObtained); EXPECT_EQ(meshNodeInfo.m_lodLevel, LodLevel); - EXPECT_EQ(meshNodeInfo.m_subMeshes.size(), 1); + ASSERT_EQ(meshNodeInfo.m_subMeshes.size(), 1); EXPECT_EQ(meshNodeInfo.m_subMeshes[0].m_primitiveIndex, 2); EXPECT_EQ(meshNodeInfo.m_subMeshes[0].m_verticesFirstIndex, 0); EXPECT_EQ(meshNodeInfo.m_subMeshes[0].m_numVertices, MeshVertices.size()); From d614b357e5cc1fe20398eb4a0244c3120be1e10f Mon Sep 17 00:00:00 2001 From: guthadam Date: Fri, 16 Apr 2021 22:11:01 -0500 Subject: [PATCH 04/10] ATOM-5921 Material Editor: Select newly created materials in the asset browser The code was previously using asset browser notifications to listen for new files being added in order to select newly created materials. Attempting to change the selection within the notification failed because the new entry still had not been added. Now the material browser queues and processes the selection on tick. https://jira.agscollab.com/browse/ATOM-5921 --- .../Source/Window/MaterialBrowserWidget.cpp | 126 ++++++++---------- .../Source/Window/MaterialBrowserWidget.h | 26 ++-- 2 files changed, 69 insertions(+), 83 deletions(-) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp index bd7e1d94ab..408ee1a478 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp @@ -10,36 +10,32 @@ * */ -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include - #include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT -#include -#include -#include -#include #include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include AZ_POP_DISABLE_WARNING namespace MaterialEditor @@ -99,7 +95,6 @@ namespace MaterialEditor } }); - AssetBrowserModelNotificationBus::Handler::BusConnect(); MaterialDocumentNotificationBus::Handler::BusConnect(); } @@ -108,7 +103,7 @@ namespace MaterialEditor // Maintains the tree expansion state between runs m_ui->m_assetBrowserTreeViewWidget->SaveState(); MaterialDocumentNotificationBus::Handler::BusDisconnect(); - AssetBrowserModelNotificationBus::Handler::BusDisconnect(); + AZ::TickBus::Handler::BusDisconnect(); } AzToolsFramework::AssetBrowser::FilterConstType MaterialBrowserWidget::CreateFilter() const @@ -151,72 +146,65 @@ namespace MaterialEditor for (const AssetBrowserEntry* entry : entries) { - const SourceAssetBrowserEntry* sourceEntry = azrtti_cast(entry); - if (!sourceEntry) + if (entry) { - const ProductAssetBrowserEntry* productEntry = azrtti_cast(entry); - if (productEntry) + if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), MaterialExtension)) { - sourceEntry = azrtti_cast(productEntry->GetParent()); + MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::OpenDocument, entry->GetFullPath()); } - } - - if (sourceEntry) - { - if (AzFramework::StringFunc::Path::IsExtension(sourceEntry->GetFullPath().c_str(), MaterialExtension)) - { - MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::OpenDocument, sourceEntry->GetFullPath()); - } - else if (AzFramework::StringFunc::Path::IsExtension(sourceEntry->GetFullPath().c_str(), MaterialTypeExtension)) + else if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), MaterialTypeExtension)) { //ignore MaterialTypeExtension } else { - QDesktopServices::openUrl(QUrl::fromLocalFile(sourceEntry->GetFullPath().c_str())); + QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str())); } } } } - void MaterialBrowserWidget::EntryAdded(const AssetBrowserEntry* entry) - { - if (m_pathToSelect.empty()) - { - return; - } - - const SourceAssetBrowserEntry* sourceEntry = azrtti_cast(entry); - if (!sourceEntry) - { - const ProductAssetBrowserEntry* productEntry = azrtti_cast(entry); - if (productEntry) - { - sourceEntry = azrtti_cast(productEntry->GetParent()); - } - } - - if (sourceEntry) - { - AZStd::string sourcePath = sourceEntry->GetFullPath(); - AzFramework::StringFunc::Path::Normalize(sourcePath); - if (m_pathToSelect == sourcePath) - { - m_ui->m_assetBrowserTreeViewWidget->SelectFileAtPath(m_pathToSelect); - m_pathToSelect.clear(); - } - } - } - void MaterialBrowserWidget::OnDocumentOpened(const AZ::Uuid& documentId) { AZStd::string absolutePath; MaterialDocumentRequestBus::EventResult(absolutePath, documentId, &MaterialDocumentRequestBus::Events::GetAbsolutePath); if (!absolutePath.empty()) { + // Selecting a new asset in the browser is not guaranteed to happen immediately. + // The asset browser model notifications are sent before the model is updated. + // Instead of relying on the notifications, queue the selection and process it on tick until this change occurs. m_pathToSelect = absolutePath; AzFramework::StringFunc::Path::Normalize(m_pathToSelect); - m_ui->m_assetBrowserTreeViewWidget->SelectFileAtPath(m_pathToSelect); + AZ::TickBus::Handler::BusConnect(); + } + } + + void MaterialBrowserWidget::OnTick(float deltaTime, AZ::ScriptTimePoint time) + { + AZ_UNUSED(time); + AZ_UNUSED(deltaTime); + + if (!m_pathToSelect.empty()) + { + // Attempt to select the new path + AzToolsFramework::AssetBrowser::AssetBrowserViewRequestBus::Broadcast( + &AzToolsFramework::AssetBrowser::AssetBrowserViewRequestBus::Events::SelectFileAtPath, m_pathToSelect); + + // Iterate over the selected entries to verify if the selection was made + for (const AssetBrowserEntry* entry : m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets()) + { + if (entry) + { + AZStd::string sourcePath = entry->GetFullPath(); + AzFramework::StringFunc::Path::Normalize(sourcePath); + if (m_pathToSelect == sourcePath) + { + // Once the selection is confirmed, cancel the operation and disconnect + AZ::TickBus::Handler::BusDisconnect(); + m_pathToSelect.clear(); + } + } + } } } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.h index d33f568ba3..38ff894214 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.h @@ -13,11 +13,11 @@ #pragma once #if !defined(Q_MOC_RUN) +#include +#include #include -#include #include #include -#include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT #include @@ -26,8 +26,6 @@ AZ_POP_DISABLE_WARNING #endif - - namespace AzToolsFramework { namespace AssetBrowser @@ -50,8 +48,8 @@ namespace MaterialEditor //! Provides a tree view of all available materials and other assets exposed by the MaterialEditor. class MaterialBrowserWidget : public QWidget - , public AzToolsFramework::AssetBrowser::AssetBrowserModelNotificationBus::Handler - , public MaterialDocumentNotificationBus::Handler + , protected AZ::TickBus::Handler + , protected MaterialDocumentNotificationBus::Handler { Q_OBJECT public: @@ -62,20 +60,20 @@ namespace MaterialEditor AzToolsFramework::AssetBrowser::FilterConstType CreateFilter() const; void OpenSelectedEntries(); + // MaterialDocumentNotificationBus::Handler implementation + void OnDocumentOpened(const AZ::Uuid& documentId) override; + + // AZ::TickBus::Handler + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + + void OpenOptionsMenu(); + QScopedPointer m_ui; AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_filterModel = nullptr; //! if new asset is being created with this path it will automatically be selected AZStd::string m_pathToSelect; - // AssetBrowserModelNotificationBus::Handler implementation - void EntryAdded(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) override; - - // MaterialDocumentNotificationBus::Handler implementation - void OnDocumentOpened(const AZ::Uuid& documentId) override; - - void OpenOptionsMenu(); - QByteArray m_materialBrowserState; }; } // namespace MaterialEditor From 9a0b47137a53d10d01c1faba3efa0b238b0f14ad Mon Sep 17 00:00:00 2001 From: spham Date: Mon, 19 Apr 2021 10:14:59 -0700 Subject: [PATCH 05/10] Add linux setup scripts to: 1. Install Linux AWSCLI 2. Install Linux Git, GitLFS, and GCM 3. Install Linux build libraries and tools for O3DE --- .../Platform/Linux/install-awscli.sh | 47 ++++++++ .../Linux/install-ubuntu-build-libraries.sh | 103 ++++++++++++++++++ .../Linux/install-ubuntu-build-tools.sh | 72 ++++++++++++ .../Platform/Linux/install-ubuntu-git.sh | 96 ++++++++++++++++ 4 files changed, 318 insertions(+) create mode 100644 scripts/build/build_node/Platform/Linux/install-awscli.sh create mode 100644 scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh create mode 100644 scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh create mode 100644 scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh diff --git a/scripts/build/build_node/Platform/Linux/install-awscli.sh b/scripts/build/build_node/Platform/Linux/install-awscli.sh new file mode 100644 index 0000000000..c9addedc82 --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/install-awscli.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +# This script must be run as root +if [ "`whoami`" != "root" ] +then + echo "This script must be run as root (sudo)" + exit 1 +fi + +# +# Install curl if its not installed +# +curl --version >/dev/null 2>&1 +if [ $? -ne 0 ] +then + echo "Installing curl" + apt-get install curl -y +fi + +# +# Setup AWS CLI if needed +# +aws --version >/dev/null 2>&1 +if [ $? -ne 0 ] +then + echo Setting up AWS CLI + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" + unzip awscliv2.zip + ./aws/install + rm -rf ./aws +else + AWS_CLI_VERSION=`aws --version | awk '{print $1}' | awk -F/ '{print $2}'` + echo AWS CLI \(version $AWS_CLI_VERSION\) already installed +fi + + + + diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh new file mode 100644 index 0000000000..7b78a53802 --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh @@ -0,0 +1,103 @@ +#!/bin/bash + +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +# This script must be run as root +if [ "`whoami`" != "root" ] +then + echo "This script must be run as root (sudo)" + exit 1 +fi + +# +# Make sure we are installing on a supported ubuntu distro +# +lsb_release -c >/dev/null 2>&1 +if [ $? -ne 0 ] +then + echo This script is only supported on Ubuntu Distros + exit 1 +fi + +UBUNTU_DISTRO="`lsb_release -c | awk '{print $2}'`" +if [ "$UBUNTU_DISTRO" == "bionic" ] +then + echo "Setup for Ubuntu 18.04 LTS ($UBUNTU_DISTRO)" +elif [ "$UBUNTU_DISTRO" == "focal" ] +then + echo "Setup for Ubuntu 20.04 LTS ($UBUNTU_DISTRO)" +else + echo "Unsupported version of Ubuntu $UBUNTU_DISTRO" + exit 1 +fi + +# +# Install curl if its not installed +# +curl --version >/dev/null 2>&1 +if [ $? -ne 0 ] +then + echo "Installing curl" + apt-get install curl -y +fi + + +# +# If the linux distro is 20.04 (focal), we need libffi.so.6, which is not part of the focal distro. We +# will install it from the bionic distro manually into focal. This is needed since Ubuntu 20.04 supports +# python 3.8 out of the box, but we are using 3.7 +# +LIBFFI6_COUNT=`apt list --installed 2>/dev/null | grep libffi6 | wc -l` +if [ "$UBUNTU_DISTRO" == "focal" ] && [ $LIBFFI6_COUNT -eq 0 ] +then + echo "Installing libffi for Ubuntu 20.04" + + pushd /tmp >/dev/null + + LIBFFI_PACKAGE_NAME=libffi6_3.2.1-8_amd64.deb + LIBFFI_PACKAGE_URL=http://mirrors.kernel.org/ubuntu/pool/main/libf/libffi/ + + curl --location $LIBFFI_PACKAGE_URL/$LIBFFI_PACKAGE_NAME -o $LIBFFI_PACKAGE_NAME + if [ $? -ne 0 ] + then + echo Unable to download $LIBFFI_PACKAGE_URL/$LIBFFI_PACKAGE_NAME + popd + exit 1 + fi + + apt install ./$LIBFFI_PACKAGE_NAME -y + if [ $? -ne 0 ] + then + echo Unable to install $LIBFFI_PACKAGE_NAME + rm -f ./$LIBFFI_PACKAGE_NAME + popd + exit 1 + fi + + rm -f ./$LIBFFI_PACKAGE_NAME + popd + echo "libffi.so.6 installed" +fi + +# Install the required build packages +apt-get install clang-6.0 -y # For the compiler and its dependencies +apt-get install libglu1-mesa-dev -y # For Qt (GL dependency) + +# The following packages resolves a runtime error with Qt Plugins +apt-get install libxcb-xinerama0 -y # For Qt plugins at runtime +apt-get install libxcb-xinput0 -y # For Qt plugins at runtime + +apt-get install libcurl4-openssl-dev -y # For HttpRequestor +apt-get install libsdl2-dev -y # For WWise + +apt-get install libz-dev -y +apt-get install mesa-common-dev -y + +echo Build Libraries Setup Complete diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh new file mode 100644 index 0000000000..eb9229d90b --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +# This script must be run as root +if [ "`whoami`" != "root" ] +then + echo "This script must be run as root (sudo)" + exit 1 +fi + +# +# Make sure we are installing on a supported ubuntu distro +# +lsb_release -c >/dev/null 2>&1 +if [ $? -ne 0 ] +then + echo This script is only supported on Ubuntu Distros + exit 1 +fi + +UBUNTU_DISTRO="`lsb_release -c | awk '{print $2}'`" +if [ "$UBUNTU_DISTRO" == "bionic" ] +then + echo "Setup for Ubuntu 18.04 LTS ($UBUNTU_DISTRO)" +elif [ "$UBUNTU_DISTRO" == "focal" ] +then + echo "Setup for Ubuntu 20.04 LTS ($UBUNTU_DISTRO)" +else + echo "Unsupported version of Ubuntu $UBUNTU_DISTRO" + exit 1 +fi + +# +# Always install the latest version of cmake (from kitware) +# +echo Installing the latest version of CMake + +# Remove any pre-existing version of cmake +apt purge --auto-remove cmake -y +wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null +CMAKE_DEB_REPO="'deb https://apt.kitware.com/ubuntu/ $UBUNTU_DISTRO main'" + +# Add the appropriate kitware repository to apt +if [ "$UBUNTU_DISTRO" == "bionic" ] +then + apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' +elif [ "$UBUNTU_DISTRO" == "focal" ] +then + apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' +fi +apt-get update + +# Install cmake +apt-get install cmake -y + + +# +# Make sure that Ninja is installed +# +echo Installing Ninja +apt-get install ninja-build -y + + +echo Build Tools Setup Complete diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh new file mode 100644 index 0000000000..a1c2923c13 --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +# This script must be run as root +if [ "`whoami`" != "root" ] +then + echo "This script must be run as root (sudo)" + exit 1 +fi + +# +# Make sure we are installing on a supported ubuntu distro +# +lsb_release -c >/dev/null 2>&1 +if [ $? -ne 0 ] +then + echo This script is only supported on Ubuntu Distros + exit 1 +fi + +UBUNTU_DISTRO="`lsb_release -c | awk '{print $2}'`" +if [ "$UBUNTU_DISTRO" == "bionic" ] +then + echo "Setup for Ubuntu 18.04 LTS ($UBUNTU_DISTRO)" +elif [ "$UBUNTU_DISTRO" == "focal" ] +then + echo "Setup for Ubuntu 20.04 LTS ($UBUNTU_DISTRO)" +else + echo "Unsupported version of Ubuntu $UBUNTU_DISTRO" + exit 1 +fi + +# +# Setup and get the latest from git if necessary +# +git --version > /dev/null 2>&1 +if [ $? -ne 0 ] +then + echo Setting up latest version of GIT + add-apt-repository ppa:git-core/ppa -y + apt-get update + apt-get install git -y +else + GIT_VERSION=`git --version | awk '{print $3}'` + echo Git $GIT_VERSION already Installed. Skipping Git installation +fi + +# +# Setup Git-LFS if needed +# +GIT_LFS_PACKAGE_COUNT=`apt list --installed 2>/dev/null | grep git-lfs/ | wc -l` +if [ $GIT_LFS_PACKAGE_COUNT -eq 0 ] +then + echo Setting up Git-LFS + pushd /tmp + wget https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh -o script.deb.sh + rm script.deb.sh + mv script.deb.sh.1 script.deb.sh + chmod +x script.deb.sh + ./script.deb.sh + sudo apt-get install git-lfs -y + popd +else + echo Git LFS already installed. Skipping Git-LFS installation +fi + +# Setup GCM if needed +git-credential-manager-core --version > /dev/null 2>&1 +if [ $? -ne 0 ] +then + # Download and setup Git Credential Manager + GCM_PACKAGE_NAME=gcmcore-linux_amd64.2.0.394.50751.deb + GCM_PACKAGE_URL=https://github.com/microsoft/Git-Credential-Manager-Core/releases/download/v2.0.394-beta + + echo Installing Git Credential Manager \($GCM_PACKAGE_NAME\) + + pushd /tmp > /dev/null + curl --location $GCM_PACKAGE_URL/$GCM_PACKAGE_NAME -o $GCM_PACKAGE_NAME + dpkg -i $GCM_PACKAGE_NAME + popd +else + GCM_VERSION=`git-credential-manager-core --version` + echo Git Credential Manager \(GCM\) version $GCM_VERSION already installed. Skipping GCM installation +fi + +# Setup pass (password manager) for git-credential-manager +apt-get install pass -y + From c9153b035350e68a1a15f6918f64d62c770e1d24 Mon Sep 17 00:00:00 2001 From: qingtao Date: Mon, 19 Apr 2021 11:47:57 -0700 Subject: [PATCH 06/10] ATOM-15272 Running game with Actor spams asserts in the log resulting in low framerate The condition was setup wrongly when introducing DynamicInputAssembly. --- Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp index 81fd9e751b..afcf4670f3 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp @@ -74,7 +74,8 @@ namespace AZ const RHI::BufferView* Buffer::GetBufferView() const { - if(RHI::CheckBitsAny(m_rhiBuffer->GetDescriptor().m_bindFlags, RHI::BufferBindFlags::InputAssembly | RHI::BufferBindFlags::DynamicInputAssembly)) + if (m_rhiBuffer->GetDescriptor().m_bindFlags == RHI::BufferBindFlags::InputAssembly || + m_rhiBuffer->GetDescriptor().m_bindFlags == RHI::BufferBindFlags::DynamicInputAssembly) { AZ_Assert(false, "Input assembly buffer doesn't need a regular buffer view, it requires a stream or index buffer view."); From 4232fa4232cbb71c2302e5de387489fa48e45590 Mon Sep 17 00:00:00 2001 From: spham Date: Mon, 19 Apr 2021 14:52:13 -0700 Subject: [PATCH 07/10] - Renamed install-awscli.sh to install-ubuntu-awscli.sh - Update to use $EUID instead of 'whoami' to determine if script is running as sudo - Tagging cmake version 3.20.1 specifically --- .../Linux/{install-awscli.sh => install-ubuntu-awscli.sh} | 2 +- .../Platform/Linux/install-ubuntu-build-libraries.sh | 2 +- .../Platform/Linux/install-ubuntu-build-tools.sh | 7 ++++--- .../build/build_node/Platform/Linux/install-ubuntu-git.sh | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) rename scripts/build/build_node/Platform/Linux/{install-awscli.sh => install-ubuntu-awscli.sh} (97%) diff --git a/scripts/build/build_node/Platform/Linux/install-awscli.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-awscli.sh similarity index 97% rename from scripts/build/build_node/Platform/Linux/install-awscli.sh rename to scripts/build/build_node/Platform/Linux/install-ubuntu-awscli.sh index c9addedc82..4c2f350859 100644 --- a/scripts/build/build_node/Platform/Linux/install-awscli.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-awscli.sh @@ -10,7 +10,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # This script must be run as root -if [ "`whoami`" != "root" ] +if [[ $EUID -ne 0 ]] then echo "This script must be run as root (sudo)" exit 1 diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh index 7b78a53802..90786a675a 100644 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh @@ -10,7 +10,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # This script must be run as root -if [ "`whoami`" != "root" ] +if [[ $EUID -ne 0 ]] then echo "This script must be run as root (sudo)" exit 1 diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh index eb9229d90b..0b341c089e 100644 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh @@ -10,7 +10,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # This script must be run as root -if [ "`whoami`" != "root" ] +if [[ $EUID -ne 0 ]] then echo "This script must be run as root (sudo)" exit 1 @@ -41,7 +41,8 @@ fi # # Always install the latest version of cmake (from kitware) # -echo Installing the latest version of CMake +CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu20.04.1 +echo Installing CMake package $CMAKE_DISTRO_VERSION # Remove any pre-existing version of cmake apt purge --auto-remove cmake -y @@ -59,7 +60,7 @@ fi apt-get update # Install cmake -apt-get install cmake -y +apt-get install cmake $CMAKE_DISTRO_VERSION -y # diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh index a1c2923c13..53554f4175 100644 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh @@ -10,7 +10,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # This script must be run as root -if [ "`whoami`" != "root" ] +if [[ $EUID -ne 0 ]] then echo "This script must be run as root (sudo)" exit 1 From 86be2647c59251bfcf9e70307334fc577a6598f9 Mon Sep 17 00:00:00 2001 From: spham Date: Mon, 19 Apr 2021 14:56:54 -0700 Subject: [PATCH 08/10] Fix apt-get command for installing specific version of cmake based on distro of ubuntu --- .../build_node/Platform/Linux/install-ubuntu-build-tools.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh index 0b341c089e..36832bb9ac 100644 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh @@ -41,7 +41,6 @@ fi # # Always install the latest version of cmake (from kitware) # -CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu20.04.1 echo Installing CMake package $CMAKE_DISTRO_VERSION # Remove any pre-existing version of cmake @@ -52,9 +51,11 @@ CMAKE_DEB_REPO="'deb https://apt.kitware.com/ubuntu/ $UBUNTU_DISTRO main'" # Add the appropriate kitware repository to apt if [ "$UBUNTU_DISTRO" == "bionic" ] then + CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu20.04.1 apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' elif [ "$UBUNTU_DISTRO" == "focal" ] then + CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu18.04.1 apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' fi apt-get update From ddb08789d207b6553293a121676f0f917faca774 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 19 Apr 2021 15:14:48 -0700 Subject: [PATCH 09/10] SPEC-6395 GameLauncher monolithic build failure in CreateModuleClass_Gem_Blas (#137) --- .../Source/Authentication/AuthenticationProviderManager.cpp | 2 +- Gems/Blast/Code/Source/BlastModule.cpp | 2 +- Gems/Blast/Code/Source/BlastModuleUnsupported.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp b/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp index f6e5efd106..d4d2d0d67b 100644 --- a/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp +++ b/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp @@ -48,7 +48,7 @@ namespace AWSClientAuth m_settingsRegistry = AZStd::make_shared(); AZStd::array resolvedPath{}; - AZ::IO::FileIOBase::GetInstance()->ResolvePath(settingsRegistryPath.data(), resolvedPath.data(), resolvedPath.size()); + fileIO->ResolvePath(settingsRegistryPath.data(), resolvedPath.data(), resolvedPath.size()); if (!m_settingsRegistry->MergeSettingsFile(resolvedPath.data(), AZ::SettingsRegistryInterface::Format::JsonMergePatch)) diff --git a/Gems/Blast/Code/Source/BlastModule.cpp b/Gems/Blast/Code/Source/BlastModule.cpp index a95b5205a4..7188d82fbd 100644 --- a/Gems/Blast/Code/Source/BlastModule.cpp +++ b/Gems/Blast/Code/Source/BlastModule.cpp @@ -69,4 +69,4 @@ namespace Blast // DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM // The first parameter should be GemName_GemIdLower // The second should be the fully qualified name of the class above -AZ_DECLARE_MODULE_CLASS(Blast_414bd211c99d4f74aef3a266b9ca208c, Blast::BlastModule) +AZ_DECLARE_MODULE_CLASS(Gem_Blast, Blast::BlastModule) diff --git a/Gems/Blast/Code/Source/BlastModuleUnsupported.cpp b/Gems/Blast/Code/Source/BlastModuleUnsupported.cpp index 6e5b76877f..429583ceda 100644 --- a/Gems/Blast/Code/Source/BlastModuleUnsupported.cpp +++ b/Gems/Blast/Code/Source/BlastModuleUnsupported.cpp @@ -14,4 +14,4 @@ // DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM // The first parameter should be GemName_GemIdLower // The second should be the fully qualified name of the class above -AZ_DECLARE_MODULE_CLASS(Blast_414bd211c99d4f74aef3a266b9ca208c, AZ::Module) +AZ_DECLARE_MODULE_CLASS(Gem_Blast, AZ::Module) From 7901fe8625b3bbd31a569f0c7dd89a7d43cd8830 Mon Sep 17 00:00:00 2001 From: AMZN-daimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Mon, 19 Apr 2021 21:52:10 -0700 Subject: [PATCH 10/10] Reset the whole Qt model when an entry in the EditorEntityModel is removed. (#48) (#82) An optimization introduced in Prefab mode currently changes the relative ordering of children, causing stale QModelIndex variables to still be referenced and crash the Editor sporadically. This change is theoretically a bit slower, but still much faster than the pre-optimization times. Co-authored-by: Shirang Jia Co-authored-by: Shirang Jia --- .../AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp index ea281aacf7..de10ae18b4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp @@ -1344,14 +1344,15 @@ namespace AzToolsFramework emit EnableSelectionUpdates(false); auto parentIndex = GetIndexFromEntity(parentId); auto childIndex = GetIndexFromEntity(childId); - beginRemoveRows(parentIndex, childIndex.row(), childIndex.row()); + beginResetModel(); } void EntityOutlinerListModel::OnEntityInfoUpdatedRemoveChildEnd(AZ::EntityId parentId, AZ::EntityId childId) { (void)childId; AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); - endRemoveRows(); + + endResetModel(); //must refresh partial lock/visibility of parents m_isFilterDirty = true;