void FSCSEditorViewportClient::Tick(float DeltaSeconds) { FEditorViewportClient::Tick(DeltaSeconds); // Register the selection override delegate for the preview actor's components TSharedPtr<SSCSEditor> SCSEditor = BlueprintEditorPtr.Pin()->GetSCSEditor(); AActor* PreviewActor = GetPreviewActor(); if (PreviewActor != nullptr) { TInlineComponentArray<UPrimitiveComponent*> PrimitiveComponents; PreviewActor->GetComponents(PrimitiveComponents); for (int32 CompIdx = 0; CompIdx < PrimitiveComponents.Num(); ++CompIdx) { UPrimitiveComponent* PrimComponent = PrimitiveComponents[CompIdx]; if (!PrimComponent->SelectionOverrideDelegate.IsBound()) { SCSEditor->SetSelectionOverride(PrimComponent); } } } else { InvalidatePreview(false); } if ( PreviewActor != LastPreviewActor.Get() || PreviewActor == nullptr || IsRealtime() ) { LastPreviewActor = PreviewActor; Invalidate(); RefreshPreviewBounds(); } // Tick the preview scene world. if (!GIntraFrameDebuggingGameThread) { // Ensure that the preview actor instance is up-to-date for component editing (e.g. after compiling the Blueprint, the actor may be reinstanced outside of this class) if(PreviewActor != BlueprintEditorPtr.Pin()->GetBlueprintObj()->SimpleConstructionScript->GetComponentEditorActorInstance()) { BlueprintEditorPtr.Pin()->GetBlueprintObj()->SimpleConstructionScript->SetComponentEditorActorInstance(PreviewActor); } // Allow full tick only if preview simulation is enabled and we're not currently in an active SIE or PIE session if(bIsSimulateEnabled && GEditor->PlayWorld == NULL && !GEditor->bIsSimulatingInEditor) { PreviewScene->GetWorld()->Tick(IsRealtime() ? LEVELTICK_All : LEVELTICK_TimeOnly, DeltaSeconds); } else { PreviewScene->GetWorld()->Tick(IsRealtime() ? LEVELTICK_ViewportsOnly : LEVELTICK_TimeOnly, DeltaSeconds); } } }
bool FCascadeEdPreviewViewportClient::InputAxis(FViewport* Viewport, int32 ControllerId, FKey Key, float Delta, float DeltaTime, int32 NumSamples, bool bGamepad) { bool bHandled = false; if (bManipulatingVectorField) { UParticleModuleVectorFieldLocal* VectorFieldModule = Cast<UParticleModuleVectorFieldLocal>(CascadePtr.Pin()->GetSelectedModule()); if (VectorFieldModule) { const float MoveX = ((Key == EKeys::MouseX) ? Delta : 0.0f) * DragX; const float MoveY = ((Key == EKeys::MouseY) ? Delta : 0.0f) * DragY; const float MoveAmount = MoveX + MoveY; VectorFieldModule->PreEditChange(NULL); if (WidgetMM == WMM_Translate) { VectorFieldModule->RelativeTranslation += (LocalManipulateDir * MoveAmount * CVarCascadeDragSpeed.GetValueOnGameThread()); } else if (WidgetMM == WMM_Rotate) { const FQuat CurrentRotation = VectorFieldModule->RelativeRotation.Quaternion(); const FQuat DeltaRotation(LocalManipulateDir, -MoveAmount * CVarCascadeRotateSpeed.GetValueOnGameThread()); const FQuat NewRotation = CurrentRotation * DeltaRotation; VectorFieldModule->RelativeRotation = FRotator(NewRotation); } else if (WidgetMM == WMM_Scale) { VectorFieldModule->RelativeScale3D += (LocalManipulateDir * MoveAmount * CVarCascadeScaleSpeed.GetValueOnGameThread()); } VectorFieldModule->PostEditChange(); } bHandled = true; } else { bHandled = FEditorViewportClient::InputAxis(Viewport,ControllerId,Key,Delta,DeltaTime,NumSamples,bGamepad); } if (!IsRealtime() && !FMath::IsNearlyZero(Delta)) { Viewport->Invalidate(); } return bHandled; }
void FSCSEditorViewportClient::ToggleIsSimulateEnabled() { // Must destroy existing actors before we toggle the world state DestroyPreview(); bIsSimulateEnabled = !bIsSimulateEnabled; PreviewScene->GetWorld()->bBegunPlay = bIsSimulateEnabled; PreviewScene->GetWorld()->bShouldSimulatePhysics = bIsSimulateEnabled; AActor* PreviewActor = GetPreviewActor(); TSharedRef<SWidget> SCSEditor = BlueprintEditorPtr.Pin()->GetSCSEditor(); TSharedRef<SWidget> Inspector = BlueprintEditorPtr.Pin()->GetInspector(); // When simulate is enabled, we don't want to allow the user to modify the components UpdatePreviewActorForBlueprint(PreviewBlueprint, true); SCSEditor->SetEnabled(!bIsSimulateEnabled); Inspector->SetEnabled(!bIsSimulateEnabled); if(!IsRealtime()) { ToggleRealtimePreview(); } }
void FSCSEditorViewportClient::ToggleRealtimePreview() { SetRealtime(!IsRealtime()); Invalidate(); }