FTransform FMovieScene3DTransformSectionRecorder::GetTransformToRecord() { if(USceneComponent* SceneComponent = Cast<USceneComponent>(ObjectToRecord.Get())) { return SceneComponent->GetRelativeTransform(); } else if(AActor* Actor = Cast<AActor>(ObjectToRecord.Get())) { bool bCaptureWorldSpaceTransform = false; USceneComponent* RootComponent = Actor->GetRootComponent(); USceneComponent* AttachParent = RootComponent ? RootComponent->GetAttachParent() : nullptr; bWasAttached = AttachParent != nullptr; if (AttachParent) { // We capture world space transforms for actors if they're attached, but we're not recording the attachment parent bCaptureWorldSpaceTransform = !FSequenceRecorder::Get().FindRecording(AttachParent->GetOwner()); } return (bCaptureWorldSpaceTransform || !RootComponent) ? Actor->ActorToWorld() : RootComponent->GetRelativeTransform(); } return FTransform::Identity; }
void FMovieScene3DConstraintTrackInstance::SaveState(const TArray<UObject*>& RuntimeObjects, IMovieScenePlayer& Player, FMovieSceneSequenceInstance& SequenceInstance) { for (int32 ObjIndex = 0; ObjIndex < RuntimeObjects.Num(); ++ObjIndex) { USceneComponent* SceneComponent = MovieSceneHelpers::SceneComponentFromRuntimeObject(RuntimeObjects[ObjIndex]); if (SceneComponent != nullptr) { if (InitTransformMap.Find(RuntimeObjects[ObjIndex]) == nullptr) { InitTransformMap.Add(RuntimeObjects[ObjIndex], SceneComponent->GetRelativeTransform()); } } } }
AActor::FActorTransactionAnnotation::FActorTransactionAnnotation(const AActor* Actor, const bool bCacheRootComponentData) : ComponentInstanceData(Actor) { USceneComponent* ActorRootComponent = Actor->GetRootComponent(); if (bCacheRootComponentData && ActorRootComponent && ActorRootComponent->IsCreatedByConstructionScript()) { bRootComponentDataCached = true; RootComponentData.Transform = ActorRootComponent->ComponentToWorld; RootComponentData.Transform.SetTranslation(ActorRootComponent->GetComponentLocation()); // take into account any custom location if (ActorRootComponent->GetAttachParent()) { RootComponentData.AttachedParentInfo.Actor = ActorRootComponent->GetAttachParent()->GetOwner(); RootComponentData.AttachedParentInfo.AttachParent = ActorRootComponent->GetAttachParent(); RootComponentData.AttachedParentInfo.AttachParentName = ActorRootComponent->GetAttachParent()->GetFName(); RootComponentData.AttachedParentInfo.SocketName = ActorRootComponent->GetAttachSocketName(); RootComponentData.AttachedParentInfo.RelativeTransform = ActorRootComponent->GetRelativeTransform(); } for (USceneComponent* AttachChild : ActorRootComponent->GetAttachChildren()) { AActor* ChildOwner = (AttachChild ? AttachChild->GetOwner() : NULL); if (ChildOwner && ChildOwner != Actor) { // Save info about actor to reattach FActorRootComponentReconstructionData::FAttachedActorInfo Info; Info.Actor = ChildOwner; Info.SocketName = AttachChild->GetAttachSocketName(); Info.RelativeTransform = AttachChild->GetRelativeTransform(); RootComponentData.AttachedToInfo.Add(Info); } } } else { bRootComponentDataCached = false; } }