void AGameplayDebuggerReplicator::OnDebugAIDelegate(class UCanvas* Canvas, class APlayerController* PC) { #if WITH_EDITOR && ENABLED_GAMEPLAY_DEBUGGER if (!GIsEditor) { return; } if (!LocalPlayerOwner) { return; } UEditorEngine* EEngine = Cast<UEditorEngine>(GEngine); if (!EEngine || !EEngine->bIsSimulatingInEditor) { return; } if (!Canvas || !Canvas->SceneView || Canvas->SceneView->bIsGameView == false) { return; } FEngineShowFlags EngineShowFlags = Canvas && Canvas->SceneView && Canvas->SceneView->Family ? Canvas->SceneView->Family->EngineShowFlags : FEngineShowFlags(GIsEditor ? EShowFlagInitMode::ESFIM_Editor : EShowFlagInitMode::ESFIM_Game); if (!EngineShowFlags.DebugAI) { return; } EnableDraw(true); UWorld* World = GetWorld(); if (World && Role == ROLE_Authority) { if (IsActorTickEnabled() == false) { SetActorTickEnabled(true); } // looks like Simulate in UE4 Editor - let's find selected Pawn to debug AActor* SelectedActor = nullptr; for (FSelectionIterator It = EEngine->GetSelectedActorIterator(); It; ++It) { SelectedActor = Cast<APawn>(*It); //we only work with pawns for now if (SelectedActor) { break; } } if (LastSelectedActorToDebug != SelectedActor) { MarkComponentsRenderStateDirty(); } ServerSetActorToDebug(SelectedActor); DrawDebugData(Canvas, PC, true); } #endif }
FSkeletonEditor::~FSkeletonEditor() { UEditorEngine* Editor = Cast<UEditorEngine>(GEngine); if (Editor != nullptr) { Editor->UnregisterForUndo(this); } }
FSubstanceEditor::~FSubstanceEditor() { UEditorEngine* Editor = (UEditorEngine*)GEngine; if (Editor != NULL) { Editor->UnregisterForUndo(this); Editor->OnObjectReimported().RemoveAll(this); } }
/** Helper function for acquiring the appropriate FSceneViewport */ FSceneViewport* FindSceneViewport() { if (!GIsEditor) { UGameEngine* GameEngine = Cast<UGameEngine>(GEngine); return GameEngine->SceneViewport.Get(); } #if WITH_EDITOR else { UEditorEngine* EditorEngine = Cast<UEditorEngine>(GEngine); return (FSceneViewport*)(EditorEngine->GetPIEViewport()); } #endif return nullptr; }
UWorld* FLogVisualizer::GetWorld(UObject* OptionalObject) { UWorld* World = OptionalObject != nullptr ? GEngine->GetWorldFromContextObject(OptionalObject, false) : nullptr; #if WITH_EDITOR if (!World && GIsEditor) { UEditorEngine *EEngine = Cast<UEditorEngine>(GEngine); // lets use PlayWorld during PIE/Simulate and regular world from editor otherwise, to draw debug information World = EEngine != nullptr && EEngine->PlayWorld != nullptr ? EEngine->PlayWorld : EEngine->GetEditorWorldContext().World(); } else #endif if (!World && !GIsEditor) { World = GEngine->GetWorld(); } if (World == nullptr) { World = GWorld; } return World; }
SVisualLogger::~SVisualLogger() { UWorld* World = NULL; #if WITH_EDITOR FCategoryFiltersManager::Get().SavePresistentData(); UEditorEngine *EEngine = Cast<UEditorEngine>(GEngine); if (GIsEditor && EEngine != NULL) { // lets use PlayWorld during PIE/Simulate and regular world from editor otherwise, to draw debug information World = EEngine->PlayWorld != NULL ? EEngine->PlayWorld : EEngine->GetEditorWorldContext().World(); } else #endif if (!GIsEditor) { World = GEngine->GetWorld(); } if (World == NULL) { World = GWorld; } if (World) { for (TActorIterator<AVisualLoggerRenderingActor> It(World); It; ++It) { World->DestroyActor(*It); } } UDebugDrawService::Unregister(DrawOnCanvasDelegateHandle); VisualLoggerCanvasRenderer.Reset(); FVisualLogger::Get().RemoveDevice(InternalDevice.Get()); InternalDevice.Reset(); }
bool FOSVRHMD::EnableStereo(bool bStereo) { bool bNewSteroEnabled = IsHMDConnected() ? bStereo : false; if (bNewSteroEnabled == bStereoEnabled) { return bStereoEnabled; } bStereoEnabled = bNewSteroEnabled; if (bStereoEnabled) { StartCustomPresent(); } else { StopCustomPresent(); } if (bHmdEnabled != bStereoEnabled) { EnableHMD(bStereoEnabled); } auto leftEye = HMDDescription.GetDisplaySize(OSVRHMDDescription::LEFT_EYE); auto rightEye = HMDDescription.GetDisplaySize(OSVRHMDDescription::RIGHT_EYE); auto width = leftEye.X + rightEye.X; auto height = leftEye.Y; GetRenderTargetSize_GameThread(width, height, width, height); // On Android, we currently use the resolution Unreal sets for us, bypassing OSVR // We may revisit once display plugins are added to OSVR-Core. #if !PLATFORM_ANDROID FSystemResolution::RequestResolutionChange(width, height, EWindowMode::Windowed); #endif FSceneViewport* sceneViewport; if (!GIsEditor) { //UE_LOG(OSVRHMDLog, Warning, TEXT("OSVR getting UGameEngine::SceneViewport viewport")); UGameEngine* gameEngine = Cast<UGameEngine>(GEngine); sceneViewport = gameEngine->SceneViewport.Get(); } #if WITH_EDITOR else { //UE_LOG(OSVRHMDLog, Warning, TEXT("OSVR getting editor viewport")); UEditorEngine* editorEngine = CastChecked<UEditorEngine>(GEngine); sceneViewport = (FSceneViewport*)editorEngine->GetPIEViewport(); if (sceneViewport == nullptr || !sceneViewport->IsStereoRenderingAllowed()) { sceneViewport = (FSceneViewport*)editorEngine->GetActiveViewport(); if (sceneViewport != nullptr && !sceneViewport->IsStereoRenderingAllowed()) { sceneViewport = nullptr; } } } #endif if (!sceneViewport) { UE_LOG(OSVRHMDLog, Warning, TEXT("OSVR scene viewport does not exist")); return false; } else { //UE_LOG(OSVRHMDLog, Warning, TEXT("OSVR scene viewport exists")); #if !WITH_EDITOR auto window = sceneViewport->FindWindow(); #endif if (bStereo) { //UE_LOG(OSVRHMDLog, Warning, TEXT("OSVR bStereo was true")); // the render targets may be larger or smaller than the display resolution // due to renderOverfillFactor and renderOversampleFactor settings // The viewports should match the render target size not the display size //if (mCustomPresent) //{ //uint32 iWidth, iHeight; //mCustomPresent->CalculateRenderTargetSize(iWidth, iHeight); //float screenScale = GetScreenScale(); //width = float(iWidth) * (1.0f / screenScale); //height = float(iHeight) * (1.0f / screenScale); //} //else //{ // temporary workaround. The above code doesn't work because when the game // is packaged, mCustomPresent is not initialized before this call. In the editor, it is. // calling CalculateRenderTargetSize when mCustomPresent isn't initialized // results in Initialize being called, which has to be done on the render thread. // The proper fix is to move the render target size API from render manager to OSVR-Core // so we don't need a graphics context to calculate them. In the meantime, we'll // implement this temporary workaround (parse the renderManagerConfig manually and // calculate the render target sizes ourselves). //} //UE_LOG(OSVRHMDLog, Warning, TEXT("OSVR Actually set viewport size")); sceneViewport->SetViewportSize(width, height); #if !WITH_EDITOR if (window.IsValid()) { window->SetViewportSizeDrivenByWindow(false); } #endif } #if !WITH_EDITOR else { if (window.IsValid()) { auto size = sceneViewport->FindWindow()->GetSizeInScreen(); sceneViewport->SetViewportSize(size.X, size.Y); window->SetViewportSizeDrivenByWindow(true); } } #endif } GEngine->bForceDisableFrameRateSmoothing = bStereo; return bStereoEnabled; }