Files
UnrealEngine/Engine/Source/Editor/VREditor/Private/VREditorModeManager.h
2025-05-18 13:04:45 +08:00

125 lines
4.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "UObject/GCObject.h"
#include "TickableEditorObject.h"
#include "HeadMountedDisplayTypes.h"
#include "IVREditorModule.h"
class UVREditorModeBase;
enum class EMapChangeType : uint8;
/**
* Manages starting and closing the VREditor mode
*/
class FVREditorModeManager : public FGCObject, public FTickableEditorObject
{
public:
/** Default constructor */
FVREditorModeManager();
/** Default destructor */
~FVREditorModeManager();
// FTickableEditorObject overrides
virtual void Tick(float DeltaTime) override;
virtual bool IsTickable() const override;
virtual TStatId GetStatId() const override
{
RETURN_QUICK_DECLARE_CYCLE_STAT(FVREditorModeManager, STATGROUP_Tickables);
}
/** Start or stop the VR Editor */
void EnableVREditor( const bool bEnable, const bool bForceWithoutHMD );
/** If the VR Editor is currently running */
bool IsVREditorActive() const;
/** If the VR Editor is currently available */
bool IsVREditorAvailable() const;
/** If the VR Editor button active */
bool IsVREditorButtonActive() const;
/** Gets the current VR Editor mode that was enabled */
UVREditorModeBase* GetCurrentVREditorMode();
// FGCObject
virtual void AddReferencedObjects( FReferenceCollector& Collector );
virtual FString GetReferencerName() const override
{
return TEXT("FVREditorModeManager");
}
// End FGCObject
/** Return a multicast delegate which is executed when VR mode starts. */
FOnVREditingModeEnter& OnVREditingModeEnter() { return OnVREditingModeEnterHandle; }
/** Return a multicast delegate which is executed when VR mode stops. */
FOnVREditingModeExit& OnVREditingModeExit() { return OnVREditingModeExitHandle; }
/**
* Loads each cached UVREditorModeBase-derived class path, checking and appending
* only those which are suitable for use (not abstract, etc.) to the provided array. */
void GetConcreteModeClasses(TArray<UClass*>& OutModeClasses) const;
DECLARE_MULTICAST_DELEGATE_OneParam(FModeClassAdded, const FTopLevelAssetPath&);
FModeClassAdded OnModeClassAdded;
DECLARE_MULTICAST_DELEGATE_OneParam(FModeClassRemoved, const FTopLevelAssetPath&);
FModeClassRemoved OnModeClassRemoved;
private:
UClass* TryGetConcreteModeClass(const FTopLevelAssetPath& ClassPath) const;
/** Queries the asset registry for asset paths of all classes derived from UVREditorModeBase. */
void GetModeClassPaths(TSet<FTopLevelAssetPath>& OutModeClassPaths) const;
/** Stores the results of GetModeClassPaths() into CachedModeClassPaths. */
void UpdateCachedModeClassPaths();
/** Cached UVREditorModeBase-derived assets, updated in response to asset registry events. */
TSet<FTopLevelAssetPath> CachedModeClassPaths;
void HandleAssetFilesLoaded();
void HandleAssetAddedOrRemoved(TConstArrayView<FAssetData> NewAssetData);
/** Broadcasts when VR mode is started */
FOnVREditingModeEnter OnVREditingModeEnterHandle;
/** Broadcasts when VR mode is stopped */
FOnVREditingModeExit OnVREditingModeExitHandle;
void HandleModeEntryComplete();
/** Saves the WorldToMeters and enters the mode belonging to GWorld */
void StartVREditorMode( const bool bForceWithoutHMD );
/** Closes the current VR Editor if any and sets the WorldToMeters to back to the one from before entering the VR mode */
void CloseVREditor(const bool bShouldDisableStereo );
/** Directly set the GWorld WorldToMeters */
void SetDirectWorldToMeters( const float NewWorldToMeters );
/** On level changed */
void OnMapChanged( UWorld* World, EMapChangeType MapChangeType );
/** The current mode, nullptr if none */
UPROPERTY()
TObjectPtr<UVREditorModeBase> CurrentVREditorMode;
/** If the VR Editor mode needs to be enabled next tick */
bool bEnableVRRequest;
/** True when we detect that the user is wearing the HMD */
EHMDWornState::Type HMDWornState;
/** True if the ViewportWorldInteraction extension was not pre-existing. */
bool bAddedViewportWorldInteractionExtension;
};