NetTransform replicates local transform for child entities

Signed-off-by: AMZN-Olex <5432499+AMZN-Olex@users.noreply.github.com>
This commit is contained in:
AMZN-Olex
2021-09-23 10:20:52 -04:00
parent 5ae35810ae
commit 3c46336ab0
6 changed files with 375 additions and 27 deletions
@@ -77,9 +77,19 @@ namespace Multiplayer
}
}
if (!GetTransformComponent()->GetWorldTM().IsClose(blendTransform))
if (GetParentEntityId() == InvalidNetEntityId)
{
GetTransformComponent()->SetWorldTM(blendTransform);
if (!GetTransformComponent()->GetWorldTM().IsClose(blendTransform))
{
GetTransformComponent()->SetWorldTM(blendTransform);
}
}
else
{
if (!GetTransformComponent()->GetLocalTM().IsClose(blendTransform))
{
GetTransformComponent()->SetLocalTM(blendTransform);
}
}
}
}
@@ -93,9 +103,19 @@ namespace Multiplayer
targetTransform.SetUniformScale(GetScale());
// Hard set the entities transform
if (!GetTransformComponent()->GetWorldTM().IsClose(targetTransform))
if (GetParentEntityId() == InvalidNetEntityId)
{
GetTransformComponent()->SetWorldTM(targetTransform);
if (!GetTransformComponent()->GetWorldTM().IsClose(targetTransform))
{
GetTransformComponent()->SetWorldTM(targetTransform);
}
}
else
{
if (!GetTransformComponent()->GetLocalTM().IsClose(targetTransform))
{
GetTransformComponent()->SetLocalTM(targetTransform);
}
}
}
@@ -117,7 +137,7 @@ namespace Multiplayer
NetworkTransformComponentController::NetworkTransformComponentController(NetworkTransformComponent& parent)
: NetworkTransformComponentControllerBase(parent)
, m_transformChangedHandler([this](const AZ::Transform&, const AZ::Transform& worldTm) { OnTransformChangedEvent(worldTm); })
, m_transformChangedHandler([this](const AZ::Transform& localTm, const AZ::Transform& worldTm) { OnTransformChangedEvent(localTm, worldTm); })
, m_parentIdChangedHandler([this](AZ::EntityId oldParent, AZ::EntityId newParent) { OnParentIdChangedEvent(oldParent, newParent); })
{
;
@@ -125,11 +145,14 @@ namespace Multiplayer
void NetworkTransformComponentController::OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
{
GetParent().GetTransformComponent()->BindTransformChangedEventHandler(m_transformChangedHandler);
OnTransformChangedEvent(GetParent().GetTransformComponent()->GetWorldTM());
if (AzFramework::TransformComponent* parentTransform = GetParent().GetTransformComponent())
{
parentTransform->BindTransformChangedEventHandler(m_transformChangedHandler);
OnTransformChangedEvent(parentTransform->GetLocalTM(), parentTransform->GetWorldTM());
GetParent().GetTransformComponent()->BindParentChangedEventHandler(m_parentIdChangedHandler);
OnParentIdChangedEvent(AZ::EntityId(), GetParent().GetTransformComponent()->GetParentId());
parentTransform->BindParentChangedEventHandler(m_parentIdChangedHandler);
OnParentIdChangedEvent(AZ::EntityId(), parentTransform->GetParentId());
}
}
void NetworkTransformComponentController::OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
@@ -137,11 +160,12 @@ namespace Multiplayer
;
}
void NetworkTransformComponentController::OnTransformChangedEvent(const AZ::Transform& worldTm)
void NetworkTransformComponentController::OnTransformChangedEvent(const AZ::Transform& localTm, const AZ::Transform& worldTm)
{
SetRotation(worldTm.GetRotation());
SetTranslation(worldTm.GetTranslation());
SetScale(worldTm.GetUniformScale());
const AZ::Transform& localOrWorld = GetParentEntityId() == InvalidNetEntityId ? worldTm : localTm;
SetRotation(localOrWorld.GetRotation());
SetTranslation(localOrWorld.GetTranslation());
SetScale(localOrWorld.GetUniformScale());
}
void NetworkTransformComponentController::OnParentIdChangedEvent([[maybe_unused]] AZ::EntityId oldParent, AZ::EntityId newParent)
@@ -150,7 +174,10 @@ namespace Multiplayer
if (parentEntity)
{
const ConstNetworkEntityHandle parentHandle(parentEntity, GetNetworkEntityTracker());
SetParentEntityId(parentHandle.GetNetEntityId());
if (parentHandle.Exists())
{
SetParentEntityId(parentHandle.GetNetEntityId());
}
}
}
}