// Copyright 2020 Phyronnaz #include "SVoxelGraphPreviewViewport.h" #include "IVoxelGraphEditorToolkit.h" #include "EditorViewportClient.h" #include "SEditorViewport.h" #include "AdvancedPreviewScene.h" #include "Slate/SceneViewport.h" #include "AssetViewerSettings.h" #include "UnrealWidget.h" /** Viewport Client for the preview viewport */ class FVoxelGraphEditorViewportClient : public FEditorViewportClient { public: FVoxelGraphEditorViewportClient(FAdvancedPreviewScene* InPreviewScene, const TSharedRef& InVoxelGraphEditorViewport); // FEditorViewportClient interface virtual bool InputKey(FViewport* InViewport, int32 ControllerId, FKey Key, EInputEvent Event, float AmountDepressed = 1.f, bool bGamepad = false) override; virtual bool InputAxis(FViewport* InViewport, int32 ControllerId, FKey Key, float Delta, float DeltaTime, int32 NumSamples/* =1 */, bool bGamepad/* =false */) override; virtual FLinearColor GetBackgroundColor() const override; virtual void Tick(float DeltaSeconds) override; virtual void Draw(FViewport* Viewport, FCanvas* Canvas) override; virtual bool ShouldOrbitCamera() const override; private: /** Preview Scene - uses advanced preview settings */ class FAdvancedPreviewScene* AdvancedPreviewScene; }; FVoxelGraphEditorViewportClient::FVoxelGraphEditorViewportClient(FAdvancedPreviewScene* InPreviewScene, const TSharedRef& InVoxelGraphEditorViewport) : FEditorViewportClient(nullptr, InPreviewScene, StaticCastSharedRef(InVoxelGraphEditorViewport)) { // Setup defaults for the common draw helper. DrawHelper.bDrawPivot = false; DrawHelper.bDrawWorldBox = false; DrawHelper.bDrawKillZ = false; DrawHelper.bDrawGrid = false; DrawHelper.GridColorAxis = FColor(80, 80, 80); DrawHelper.GridColorMajor = FColor(72, 72, 72); DrawHelper.GridColorMinor = FColor(64, 64, 64); DrawHelper.PerspectiveGridSize = HALF_WORLD_MAX1; SetViewMode(VMI_Lit); EngineShowFlags.DisableAdvancedFeatures(); EngineShowFlags.SetSnap(false); EngineShowFlags.SetSeparateTranslucency(true); OverrideNearClipPlane(1.0f); bUsingOrbitCamera = true; // Don't want to display the widget in this viewport Widget->SetDefaultVisibility(false); AdvancedPreviewScene = InPreviewScene; } void FVoxelGraphEditorViewportClient::Tick(float DeltaSeconds) { FEditorViewportClient::Tick(DeltaSeconds); // Tick the preview scene world. if (!GIntraFrameDebuggingGameThread) { PreviewScene->GetWorld()->Tick(LEVELTICK_All, DeltaSeconds); } } void FVoxelGraphEditorViewportClient::Draw(FViewport* InViewport, FCanvas* Canvas) { FEditorViewportClient::Draw(InViewport, Canvas); } bool FVoxelGraphEditorViewportClient::ShouldOrbitCamera() const { // Should always orbit around the preview object to keep it in view. return true; } bool FVoxelGraphEditorViewportClient::InputKey(FViewport* InViewport, int32 ControllerId, FKey Key, EInputEvent Event, float AmountDepressed, bool bGamepad) { bool bHandled = FEditorViewportClient::InputKey(InViewport, ControllerId, Key, Event, AmountDepressed, false); // Handle viewport screenshot. bHandled |= InputTakeScreenshot(InViewport, Key, Event); bHandled |= AdvancedPreviewScene->HandleInputKey(InViewport, ControllerId, Key, Event, AmountDepressed, bGamepad); return bHandled; } bool FVoxelGraphEditorViewportClient::InputAxis(FViewport* InViewport, int32 ControllerId, FKey Key, float Delta, float DeltaTime, int32 NumSamples/* =1 */, bool bGamepad/* =false */) { bool bResult = true; if (!bDisableInput) { bResult = AdvancedPreviewScene->HandleViewportInput(InViewport, ControllerId, Key, Delta, DeltaTime, NumSamples, bGamepad); if (bResult) { Invalidate(); } else { bResult = FEditorViewportClient::InputAxis(InViewport, ControllerId, Key, Delta, DeltaTime, NumSamples, bGamepad); } } return bResult; } FLinearColor FVoxelGraphEditorViewportClient::GetBackgroundColor() const { if (AdvancedPreviewScene != nullptr) { return AdvancedPreviewScene->GetBackgroundColor(); } else { return FLinearColor::White; } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// void SVoxelGraphPreviewViewport::Construct(const FArguments& InArgs) { VoxelGraphEditorToolkit = InArgs._VoxelGraphEditorToolkit; AdvancedPreviewScene = VoxelGraphEditorToolkit.Pin()->GetPreviewScene(); SEditorViewport::Construct(SEditorViewport::FArguments()); } SVoxelGraphPreviewViewport::~SVoxelGraphPreviewViewport() { UAssetViewerSettings::Get()->OnAssetViewerSettingsChanged().RemoveAll(this); if (EditorViewportClient.IsValid()) { EditorViewportClient->Viewport = NULL; } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// TSharedRef SVoxelGraphPreviewViewport::GetViewportWidget() { return SharedThis(this); } TSharedPtr SVoxelGraphPreviewViewport::GetExtenders() const { TSharedPtr Result(MakeShareable(new FExtender)); return Result; } void SVoxelGraphPreviewViewport::OnFloatingButtonClicked() { } void SVoxelGraphPreviewViewport::RefreshViewport() { Client->RedrawRequested(nullptr); GEditor->UpdateSingleViewportClient(Client.Get(), true, false); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// TSharedRef SVoxelGraphPreviewViewport::MakeEditorViewportClient() { EditorViewportClient = MakeShareable(new FVoxelGraphEditorViewportClient(AdvancedPreviewScene, SharedThis(this))); EditorViewportClient->SetViewLocation(FVector::ZeroVector); EditorViewportClient->SetViewRotation(FRotator(0.0f, -90.0f, 0.0f)); EditorViewportClient->SetViewLocationForOrbiting(FVector::ZeroVector); return EditorViewportClient.ToSharedRef(); }