void UGripMotionControllerComponent::FViewExtension::GatherLateUpdatePrimitives(USceneComponent* Component, TArray<LateUpdatePrimitiveInfo>& Primitives) { // If a scene proxy is present, cache it UPrimitiveComponent* PrimitiveComponent = dynamic_cast<UPrimitiveComponent*>(Component); if (PrimitiveComponent && PrimitiveComponent->SceneProxy) { FPrimitiveSceneInfo* PrimitiveSceneInfo = PrimitiveComponent->SceneProxy->GetPrimitiveSceneInfo(); if (PrimitiveSceneInfo) { LateUpdatePrimitiveInfo PrimitiveInfo; PrimitiveInfo.IndexAddress = PrimitiveSceneInfo->GetIndexAddress(); PrimitiveInfo.SceneInfo = PrimitiveSceneInfo; Primitives.Add(PrimitiveInfo); } } // Gather children proxies const int32 ChildCount = Component->GetNumChildrenComponents(); for (int32 ChildIndex = 0; ChildIndex < ChildCount; ++ChildIndex) { USceneComponent* ChildComponent = Component->GetChildComponent(ChildIndex); if (!ChildComponent) { continue; } GatherLateUpdatePrimitives(ChildComponent, Primitives); } }
//============================================================================= void UMotionControllerComponent::FViewExtension::BeginRenderViewFamily(FSceneViewFamily& InViewFamily) { if (!MotionControllerComponent) { return; } FScopeLock ScopeLock(&CritSect); if (!MotionControllerComponent || MotionControllerComponent->bDisableLowLatencyUpdate || !CVarEnableMotionControllerLateUpdate.GetValueOnGameThread()) { return; } LateUpdatePrimitives.Reset(); GatherLateUpdatePrimitives(MotionControllerComponent, LateUpdatePrimitives); }
void UGripMotionControllerComponent::FViewExtension::BeginRenderViewFamily(FSceneViewFamily& InViewFamily) { if (!MotionControllerComponent) { return; } FScopeLock ScopeLock(&CritSect); if (MotionControllerComponent->bDisableLowLatencyUpdate || !CVarEnableMotionControllerLateUpdate->GetValueOnGameThread()) { return; } LateUpdatePrimitives.Reset(); GatherLateUpdatePrimitives(MotionControllerComponent, LateUpdatePrimitives); // Loop through gripped actors for (FBPActorGripInformation actor : MotionControllerComponent->GrippedActors) { // Attached actors will already register as is above, so skipping GripWithAttachTo actors if (actor.bTurnOffLateUpdateWhenColliding && actor.bColliding) continue; if (actor.Actor) { // Get primitive components attached to the actor and update them with the late motion controller offset TInlineComponentArray<UPrimitiveComponent*> PrimComps(actor.Actor); for (UPrimitiveComponent * PrimitiveComponent : PrimComps) { GatherLateGripUpdatePrimitives(PrimitiveComponent, LateUpdatePrimitives); } } else if (actor.Component) { GatherLateGripUpdatePrimitives(actor.Component, LateUpdatePrimitives); } } }
void IHeadMountedDisplay::SetupLateUpdate(const FTransform& ParentToWorld, USceneComponent* Component) { LateUpdateParentToWorld = ParentToWorld; LateUpdatePrimitives.Reset(); GatherLateUpdatePrimitives(Component, LateUpdatePrimitives); }