123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <CommonHierarchySetup.h>
- #include <MockInterfaces.h>
- #include <AzCore/Component/Entity.h>
- #include <AzCore/Console/Console.h>
- #include <AzCore/Name/Name.h>
- #include <AzCore/UnitTest/TestTypes.h>
- #include <AzCore/UnitTest/UnitTest.h>
- #include <AzFramework/Components/TransformComponent.h>
- #include <AzTest/AzTest.h>
- #include <Multiplayer/Components/NetBindComponent.h>
- #include <Multiplayer/NetworkEntity/EntityReplication/EntityReplicator.h>
- namespace Multiplayer
- {
- using namespace testing;
- using namespace ::UnitTest;
- /*
- * (Networked) Parent -> (Networked) Child
- */
- class ServerNetTransformTests : public HierarchyTests
- {
- public:
- void SetUp() override
- {
- HierarchyTests::SetUp();
- m_root = AZStd::make_unique<EntityInfo>(1, "root", NetEntityId{ 1 }, EntityInfo::Role::Root);
- m_child = AZStd::make_unique<EntityInfo>(2, "child", NetEntityId{ 2 }, EntityInfo::Role::Child);
- CreateNetworkParentChild(*m_root, *m_child);
- AZ::Transform rootTransform = AZ::Transform::CreateIdentity();
- rootTransform.SetTranslation(AZ::Vector3::CreateOne());
- m_root->m_entity->FindComponent<AzFramework::TransformComponent>()->SetWorldTM(rootTransform);
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->SetWorldTM(rootTransform);
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->SetParent(m_root->m_entity->GetId());
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->SetLocalTM(AZ::Transform::CreateIdentity());
- AZ::EntityBus::Broadcast(&AZ::EntityBus::Events::OnEntityActivated, m_root->m_entity->GetId());
- MultiplayerTick();
- }
- void TearDown() override
- {
- m_child.reset();
- m_root.reset();
- HierarchyTests::TearDown();
- }
- void PopulateNetworkEntity(const EntityInfo& entityInfo)
- {
- entityInfo.m_entity->CreateComponent<AzFramework::TransformComponent>();
- entityInfo.m_entity->CreateComponent<NetBindComponent>();
- entityInfo.m_entity->CreateComponent<NetworkTransformComponent>();
- }
- void CreateNetworkParentChild(EntityInfo& root, EntityInfo& child)
- {
- PopulateNetworkEntity(root);
- SetupEntity(root.m_entity, root.m_netId, NetEntityRole::Authority);
- PopulateNetworkEntity(child);
- SetupEntity(child.m_entity, child.m_netId, NetEntityRole::Authority);
- // Create an entity replicator for the child entity
- const NetworkEntityHandle childHandle(child.m_entity.get(), m_networkEntityTracker.get());
- child.m_replicator = AZStd::make_unique<EntityReplicator>(*m_entityReplicationManager, m_mockConnection.get(), NetEntityRole::Client, childHandle);
- child.m_replicator->Initialize(childHandle);
- // Create an entity replicator for the root entity
- const NetworkEntityHandle rootHandle(root.m_entity.get(), m_networkEntityTracker.get());
- root.m_replicator = AZStd::make_unique<EntityReplicator>(*m_entityReplicationManager, m_mockConnection.get(), NetEntityRole::Client, rootHandle);
- root.m_replicator->Initialize(rootHandle);
- root.m_entity->Activate();
- child.m_entity->Activate();
- }
- AZStd::unique_ptr<EntityInfo> m_root;
- AZStd::unique_ptr<EntityInfo> m_child;
- void MultiplayerTick()
- {
- m_root->m_entity->FindComponent<NetBindComponent>()->NotifyPreRender(0.1f);
- m_child->m_entity->FindComponent<NetBindComponent>()->NotifyPreRender(0.1f);
- }
- };
- TEST_F(ServerNetTransformTests, SanityCheck)
- {
- EXPECT_EQ(
- m_root->m_entity->FindComponent<AzFramework::TransformComponent>()->GetWorldTM().GetTranslation(),
- AZ::Vector3::CreateOne()
- );
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetWorldTM().GetTranslation(),
- AZ::Vector3::CreateOne()
- );
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetLocalTM().GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- }
- TEST_F(ServerNetTransformTests, NetTransformSavesLocalTransformWhenParentSet)
- {
- EXPECT_EQ(
- m_child->m_entity->FindComponent<NetworkTransformComponent>()->GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- }
- TEST_F(ServerNetTransformTests, NetTransformSavesWorldTransformWhenParentIsNotSet)
- {
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->SetParent(AZ::EntityId());
- MultiplayerTick();
- EXPECT_EQ(
- m_child->m_entity->FindComponent<NetworkTransformComponent>()->GetTranslation(),
- AZ::Vector3::CreateOne() // back at the parent translation
- );
- }
- TEST_F(ServerNetTransformTests, ParentMovesChildNetTransformDoesntChange)
- {
- EXPECT_EQ(
- m_child->m_entity->FindComponent<NetworkTransformComponent>()->GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- // move the parent
- AZ::Transform rootTransform = AZ::Transform::CreateIdentity();
- rootTransform.SetTranslation(AZ::Vector3::CreateOne() * 10.f);
- m_root->m_entity->FindComponent<AzFramework::TransformComponent>()->SetWorldTM(rootTransform);
- MultiplayerTick();
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetWorldTM().GetTranslation(),
- AZ::Vector3::CreateOne() * 10.f
- );
- // child local tm doesn't change
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetLocalTM().GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- EXPECT_EQ(
- m_child->m_entity->FindComponent<NetworkTransformComponent>()->GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- }
- /*
- * (Networked) Parent -> (Networked) Child
- */
- class ClientNetTransformTests : public HierarchyTests
- {
- public:
- void SetUp() override
- {
- HierarchyTests::SetUp();
- m_root = AZStd::make_unique<EntityInfo>(1, "root", NetEntityId{ 1 }, EntityInfo::Role::Root);
- m_child = AZStd::make_unique<EntityInfo>(2, "child", NetEntityId{ 2 }, EntityInfo::Role::Child);
- CreateNetworkParentChild(*m_root, *m_child);
- }
- void TearDown() override
- {
- m_child.reset();
- m_root.reset();
- HierarchyTests::TearDown();
- }
- void PopulateNetworkEntity(const EntityInfo& entityInfo)
- {
- entityInfo.m_entity->CreateComponent<AzFramework::TransformComponent>();
- entityInfo.m_entity->CreateComponent<NetBindComponent>();
- entityInfo.m_entity->CreateComponent<NetworkTransformComponent>();
- }
- void CreateNetworkParentChild(EntityInfo& root, EntityInfo& child)
- {
- PopulateNetworkEntity(root);
- SetupEntity(root.m_entity, root.m_netId, NetEntityRole::Client);
- PopulateNetworkEntity(child);
- SetupEntity(child.m_entity, child.m_netId, NetEntityRole::Client);
- // Create an entity replicator for the child entity
- const NetworkEntityHandle childHandle(child.m_entity.get(), m_networkEntityTracker.get());
- child.m_replicator = AZStd::make_unique<EntityReplicator>(*m_entityReplicationManager, m_mockConnection.get(), NetEntityRole::Authority, childHandle);
- child.m_replicator->Initialize(childHandle);
- // Create an entity replicator for the root entity
- const NetworkEntityHandle rootHandle(root.m_entity.get(), m_networkEntityTracker.get());
- root.m_replicator = AZStd::make_unique<EntityReplicator>(*m_entityReplicationManager, m_mockConnection.get(), NetEntityRole::Authority, rootHandle);
- root.m_replicator->Initialize(rootHandle);
- }
- AZStd::unique_ptr<EntityInfo> m_root;
- AZStd::unique_ptr<EntityInfo> m_child;
- void MultiplayerTick()
- {
- m_root->m_entity->FindComponent<NetBindComponent>()->NotifyPreRender(0.1f);
- m_child->m_entity->FindComponent<NetBindComponent>()->NotifyPreRender(0.1f);
- }
- };
- TEST_F(ClientNetTransformTests, ClientSetsLocalTmWhenParentIsSet)
- {
- m_root->m_entity->Activate();
- m_child->m_entity->Activate();
- SetTranslationOnNetworkTransform(m_root->m_entity, AZ::Vector3::CreateOne());
- SetParentIdOnNetworkTransform(m_child->m_entity, NetEntityId{ 1 });
- SetTranslationOnNetworkTransform(m_child->m_entity, AZ::Vector3::CreateZero());
- AZ::EntityBus::Broadcast(&AZ::EntityBus::Events::OnEntityActivated, m_root->m_entity->GetId());
- MultiplayerTick();
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetWorldTM().GetTranslation(),
- AZ::Vector3::CreateOne()
- );
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetLocalTM().GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- }
- TEST_F(ClientNetTransformTests, ClientSetsWorldTmWhenParentIsNotSet)
- {
- m_root->m_entity->Activate();
- m_child->m_entity->Activate();
- SetTranslationOnNetworkTransform(m_root->m_entity, AZ::Vector3::CreateOne());
- SetTranslationOnNetworkTransform(m_child->m_entity, AZ::Vector3::CreateZero());
- AZ::EntityBus::Broadcast(&AZ::EntityBus::Events::OnEntityActivated, m_root->m_entity->GetId());
- MultiplayerTick();
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetWorldTM().GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetLocalTM().GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- }
- TEST_F(ClientNetTransformTests, ChildFollowsWhenParentMovesOnServer)
- {
- m_root->m_entity->Activate();
- m_child->m_entity->Activate();
- SetTranslationOnNetworkTransform(m_root->m_entity, AZ::Vector3::CreateOne());
- SetParentIdOnNetworkTransform(m_child->m_entity, NetEntityId{ 1 });
- SetTranslationOnNetworkTransform(m_child->m_entity, AZ::Vector3::CreateZero());
- AZ::EntityBus::Broadcast(&AZ::EntityBus::Events::OnEntityActivated, m_root->m_entity->GetId());
- MultiplayerTick();
- // now parent moves
- SetTranslationOnNetworkTransform(m_root->m_entity, AZ::Vector3::CreateOne() * 2.f);
- MultiplayerTick();
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetWorldTM().GetTranslation(),
- AZ::Vector3::CreateOne() * 2.f
- );
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetLocalTM().GetTranslation(),
- AZ::Vector3::CreateZero()
- );
- }
- TEST_F(ClientNetTransformTests, ChildAttachesToParentIfParentIdIsSetBeforeActivation)
- {
- m_root->m_entity->Activate();
- SetTranslationOnNetworkTransform(m_root->m_entity, AZ::Vector3::CreateOne());
- SetParentIdOnNetworkTransform(m_child->m_entity, NetEntityId{ 1 });
- SetTranslationOnNetworkTransform(m_child->m_entity, AZ::Vector3::CreateZero());
- m_child->m_entity->Activate();
- AZ::EntityBus::Broadcast(&AZ::EntityBus::Events::OnEntityActivated, m_root->m_entity->GetId());
- MultiplayerTick();
- EXPECT_EQ(
- m_child->m_entity->FindComponent<AzFramework::TransformComponent>()->GetParentId(),
- AZ::EntityId(1)
- );
- }
- TEST_F(ClientNetTransformTests, CorrectionSyncsTransform)
- {
- m_root->m_entity->Activate();
- m_child->m_entity->Activate();
- SetTranslationOnNetworkTransform(m_root->m_entity, AZ::Vector3::CreateOne());
- SetParentIdOnNetworkTransform(m_child->m_entity, NetEntityId{ 1 });
- m_root->m_entity->FindComponent<NetBindComponent>()->NotifyCorrection();
- EXPECT_EQ(m_root->m_entity->GetTransform()->GetWorldTranslation(), AZ::Vector3::CreateOne());
- SetTranslationOnNetworkTransform(m_child->m_entity, AZ::Vector3::CreateOne());
- m_child->m_entity->FindComponent<NetBindComponent>()->NotifyCorrection();
- EXPECT_EQ(m_child->m_entity->GetTransform()->GetLocalTranslation(), AZ::Vector3::CreateOne());
- }
- }
|