Files
2025-05-18 13:04:45 +08:00

68 lines
2.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SubTransformProxy.h"
#include "Components/SceneComponent.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(SubTransformProxy)
USubTransformProxy::USubTransformProxy()
{
RelativeTransform = FTransform::Identity;
}
FTransform USubTransformProxy::AddSubTransformProxy(USubTransformProxy* InProxy, bool bSubscribeToChanges)
{
check(InProxy);
FTransform OriginalTransform = InProxy->GetTransform();
// Add each object to the proxy
for (FRelativeObject& Object : InProxy->Objects)
{
FRelativeObject& NewObj = Objects.Emplace_GetRef();
NewObj.Component = Object.Component;
NewObj.bModifyComponentOnTransform = Object.bModifyComponentOnTransform;
NewObj.StartTransform = Object.Component->GetComponentToWorld();
NewObj.RelativeTransform = FTransform::Identity;
}
UpdateSharedTransform();
// Get the relative transform of the InProxy we just added
OriginalTransform.SetToRelativeTransform(SharedTransform);
if (bSubscribeToChanges)
{
OnTransformChanged.AddUObject(InProxy, &USubTransformProxy::OnParentTransformChanged);
OnRelativeTransformChanged.AddUObject(InProxy, &USubTransformProxy::OnParentRelativeTransformChanged);
}
OnRelativeTransformChanged.Broadcast(this, SharedTransform);
OnTransformChanged.Broadcast(this, SharedTransform);
return OriginalTransform;
}
void USubTransformProxy::OnParentTransformChanged(UTransformProxy* Parent, FTransform ParentTransform)
{
FTransform OriginalTransform = SharedTransform;
FTransform::Multiply(&SharedTransform, &RelativeTransform, &ParentTransform);
// Parent Transform changing doesn't have to mean that your transform changed
if (!SharedTransform.Equals(OriginalTransform))
{
UpdateObjectTransforms();
OnTransformChanged.Broadcast(this, SharedTransform);
}
}
void USubTransformProxy::OnParentRelativeTransformChanged(UTransformProxy* Parent, FTransform ParentTransform)
{
RelativeTransform = SharedTransform.GetRelativeTransform(ParentTransform);
}