// Copyright PICO Technology Co., Ltd. All rights reserved. // This plugin incorporates portions of the UnrealĀ® Engine. UnrealĀ® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere. // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "IXRLoadingScreen.h" #include "TickableObjectRenderThread.h" #include "PXR_StereoLayer.h" #include "PXR_HMDTypes.h" #include "PXR_HMDRuntimeSettings.h" #include "PXR_GameFrame.h" struct FPXRSplashLayer { FPXRSplashDesc Desc; FPICOLayerPtr Layer; public: FPXRSplashLayer(const FPXRSplashDesc& InSplashDesc) : Desc(InSplashDesc) {} FPXRSplashLayer(const FPXRSplashLayer& InSplashLayer) : Desc(InSplashLayer.Desc), Layer(InSplashLayer.Layer) {} }; class FPXRSplash : public IXRLoadingScreen, public TSharedFromThis { protected: class FSplashTicker_RenderThread : public FTickableObjectRenderThread, public TSharedFromThis { public: FSplashTicker_RenderThread(FPXRSplash* InSplash) : FTickableObjectRenderThread(false, true), PXRSplash(InSplash) {} virtual void Tick(float DeltaTime) override { PXRSplash->SplashTick_RenderThread(DeltaTime); } virtual TStatId GetStatId() const override { RETURN_QUICK_DECLARE_CYCLE_STAT(FPXRSplash, STATGROUP_Tickables); } virtual bool IsTickable() const override { return true; } protected: FPXRSplash* PXRSplash; }; public: FPXRSplash(FPICOXRHMD* InPICOXRHMD); virtual ~FPXRSplash(); virtual void ShowLoadingScreen() override; virtual void HideLoadingScreen() override; virtual bool IsPlayingLoadingMovie() const override; virtual void ClearSplashes() override; virtual void AddSplash(const FSplashDesc& InSplashDesc) override; virtual bool IsShown() const override { return bIsShown; } void InitSplash(); void ShutDownSplash(); void ReleaseResources_RHIThread(); void OnPreLoadMap(const FString& MapName); void AutoShow(bool AutoShowSplash); void AddPXRSplashLayers(const FPXRSplashDesc& Splash); void SwitchActiveSplash_GameThread(); TArray PXRLayers_RHIThread; FPICOLayerPtr BlackLayer; protected: void SplashTick_RenderThread(float DeltaTime); void AddSplashFromPXRSettings(); void OnPostLoadMap(UWorld*); void BeginTicker(); void EndTicker(); void ToShow(); void ToHide(); void ReleaseAllTextures(); void ReleaseTexture(FPXRSplashLayer& InSplashLayer); void LoadTexture(FPXRSplashLayer& InSplashLayer); void RenderSplashFrame_RenderThread(FRHICommandListImmediate& RHICmdList); IStereoLayers::FLayerDesc CreateStereoLayerDescFromPXRSplashDesc(FPXRSplashDesc PXRSplashDesc); TSharedPtr SplashTicker; FCriticalSection RenderThreadLock; bool bInitialized; FPICOXRHMD* PICOXRHMD; FPICOXRRenderBridge* CustomRenderBridge; FDelegateHandle PostLoadLevelDelegate; UPICOXRSettings* PICOSettings; FSettingsPtr Settings; FPXRGameFramePtr PXRFrame; bool bIsShown; bool bSplashNeedUpdateActiveState; bool bSplashShouldToShow; TArray AddedPXRSplashLayers; TArray PXRLayers_RenderThread_Entry; TArray PXRLayers_RenderThread; int32 FramesOutstanding; }; typedef TSharedPtr FPICOXRSplashPtr;