CelticCraft/Plugins/VoxelFree/Source/VoxelGraphEditor/Private/Preview/SVoxelGraphPreviewViewport.cpp

187 lines
No EOL
6.1 KiB
C++

// 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<SVoxelGraphPreviewViewport>& 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<SVoxelGraphPreviewViewport>& InVoxelGraphEditorViewport)
: FEditorViewportClient(nullptr, InPreviewScene, StaticCastSharedRef<SEditorViewport>(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<class SEditorViewport> SVoxelGraphPreviewViewport::GetViewportWidget()
{
return SharedThis(this);
}
TSharedPtr<FExtender> SVoxelGraphPreviewViewport::GetExtenders() const
{
TSharedPtr<FExtender> Result(MakeShareable(new FExtender));
return Result;
}
void SVoxelGraphPreviewViewport::OnFloatingButtonClicked()
{
}
void SVoxelGraphPreviewViewport::RefreshViewport()
{
Client->RedrawRequested(nullptr);
GEditor->UpdateSingleViewportClient(Client.Get(), true, false);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
TSharedRef<FEditorViewportClient> 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();
}