48 lines
1.5 KiB
C
48 lines
1.5 KiB
C
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Engine/StreamableManager.h"
|
|
|
|
DECLARE_DELEGATE_OneParam(FLyraAssetManagerStartupJobSubstepProgress, float /*NewProgress*/);
|
|
|
|
/** Handles reporting progress from streamable handles */
|
|
struct FLyraAssetManagerStartupJob
|
|
{
|
|
FLyraAssetManagerStartupJobSubstepProgress SubstepProgressDelegate;
|
|
TFunction<void(const FLyraAssetManagerStartupJob&, TSharedPtr<FStreamableHandle>&)> JobFunc;
|
|
FString JobName;
|
|
float JobWeight;
|
|
mutable double LastUpdate = 0;
|
|
|
|
/** Simple job that is all synchronous */
|
|
FLyraAssetManagerStartupJob(const FString& InJobName, const TFunction<void(const FLyraAssetManagerStartupJob&, TSharedPtr<FStreamableHandle>&)>& InJobFunc, float InJobWeight)
|
|
: JobFunc(InJobFunc)
|
|
, JobName(InJobName)
|
|
, JobWeight(InJobWeight)
|
|
{}
|
|
|
|
/** Perform actual loading, will return a handle if it created one */
|
|
TSharedPtr<FStreamableHandle> DoJob() const;
|
|
|
|
void UpdateSubstepProgress(float NewProgress) const
|
|
{
|
|
SubstepProgressDelegate.ExecuteIfBound(NewProgress);
|
|
}
|
|
|
|
void UpdateSubstepProgressFromStreamable(TSharedRef<FStreamableHandle> StreamableHandle) const
|
|
{
|
|
if (SubstepProgressDelegate.IsBound())
|
|
{
|
|
// StreamableHandle::GetProgress traverses() a large graph and is quite expensive
|
|
double Now = FPlatformTime::Seconds();
|
|
if (LastUpdate - Now > 1.0 / 60)
|
|
{
|
|
SubstepProgressDelegate.Execute(StreamableHandle->GetProgress());
|
|
LastUpdate = Now;
|
|
}
|
|
}
|
|
}
|
|
};
|