68 lines
2.0 KiB
C++
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);
|
|
}
|
|
|
|
|