2019-12-26 14:45:42 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2015-06-29 23:13:34 -04:00
# pragma once
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
# include "CoreMinimal.h"
# include "Containers/UnrealString.h"
# include "Delegates/Delegate.h"
# include "UObject/ScriptMacros.h"
# include "UObject/ObjectMacros.h"
# include "UObject/Object.h"
# include "UObject/Stack.h"
# include "RuntimeAssetCacheInterface.h"
# include "RuntimeAssetCachePluginInterface.h"
2015-06-29 23:13:34 -04:00
# include "RuntimeAssetCacheBuilders.generated.h"
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
class FArchive ;
class UTexture2D ;
2015-06-29 23:13:34 -04:00
DECLARE_DYNAMIC_DELEGATE_TwoParams ( FOnAssetCacheComplete , URuntimeAssetCacheBuilder_ObjectBase * , CachedAssetBuilder , bool , Success ) ;
2015-06-30 08:17:51 -04:00
class UTexture2D ;
2015-06-29 23:13:34 -04:00
UCLASS ( BlueprintType )
class RUNTIMEASSETCACHE_API URuntimeAssetCacheBuilder_ObjectBase : public UObject , public IRuntimeAssetCacheBuilder
{
GENERATED_BODY ( )
public :
virtual void PostInitProperties ( ) override
{
Super : : PostInitProperties ( ) ;
CacheHandle = 0 ;
2015-08-05 15:54:57 -04:00
bProcessedCacheMiss = false ;
2015-06-29 23:13:34 -04:00
}
virtual const TCHAR * GetBucketConfigName ( ) const override
{
return TEXT ( " DefaultBucket " ) ;
}
virtual const TCHAR * GetBuilderName ( ) const override
{
return TEXT ( " UObject " ) ;
}
virtual FString GetAssetUniqueName ( ) const override
{
return AssetName ;
}
virtual bool IsBuildThreadSafe ( ) const
{
return true ;
}
virtual bool ShouldBuildAsynchronously ( ) const override
{
return true ;
}
virtual int32 GetAssetVersion ( ) override
{
return AssetVersion ;
}
/**
* Override and make a custom serialization function to save / load the important UObject data to disk
*/
virtual void SerializeAsset ( FArchive & Ar )
{
}
/**
* Estimate the size ( in bytes ) of the Data saved in SerializeData . This makes the buffer memory usage is more efficient .
* This is not necessary . However , the closer the estimate is to the actual size the more efficient the memory allocations will be .
*/
virtual int64 GetSerializedDataSizeEstimate ( )
{
return 1024 ;
}
FVoidPtrParam Build ( ) override ;
/**
* Call this to get the asset named AssetName from the runtime asset cache .
* If the asset does not exist on disk , then OnAssetCacheMiss will be called .
* Implement OnAssetCacheMiss in order to create the asset that you want cached .
*/
UFUNCTION ( BlueprintCallable , Category = RuntimeAssetCache )
void GetFromCacheAsync ( const FOnAssetCacheComplete & OnComplete ) ;
UFUNCTION ( )
void GetFromCacheAsyncComplete ( int32 Handle , FVoidPtrParam DataPtr ) ;
/**
* Make sure Asset is set up and ready to be loaded into
*/
virtual void OnAssetPreLoad ( ) { }
/**
* Perform any specific init functions after load
*/
virtual void OnAssetPostLoad ( ) { }
/**
* When you get OnAssetCacheMiss you need to load / create the asset that is missing .
* Call SaveNewAssetToCache after you ' re finished creating the asset to save it back into the cache for next time .
* This will then trigger OnAssetCacheComplete like normal , so you don ' t need additional code to handle it .
*/
UFUNCTION ( BlueprintNativeEvent , Category = RuntimeAssetCache )
void OnAssetCacheMiss ( ) ;
virtual void OnAssetCacheMiss_Implementation ( )
{
//
// Override and create the new asset here (this is where we would render to a render target, then get the result)
//
// Make sure the new asset gets properly cached for next time.
SaveNewAssetToCache ( Asset ) ;
}
/**
* Call SaveNewAssetToCache to save an asset back into the cache for next time .
* This will then trigger OnAssetCacheComplete like normal , so you don ' t need additional code to handle it .
*/
UFUNCTION ( BlueprintCallable , Category = RuntimeAssetCache )
void SaveNewAssetToCache ( UObject * NewAsset ) ;
/**
* This merely sets Asset and calls OnSetAsset . Use SaveNewAssetToCache to actually cache a new asset .
*/
void SetAsset ( UObject * NewAsset ) ;
/**
* Please override in your child class to provide easy access to the Asset .
* Declare a specific UObject * variable in your subclass to make it easy for BP nodes to access , e . g . UPROPERTY ( ) UTexture * Texture ;
* This function will always get called when the Asset changes
* So set your specific variable here , e . g . Texture = Cast < UTexture2D > ( NewAsset ) ;
*/
virtual void OnSetAsset ( UObject * NewAsset )
{
// Example:
// Texture = Cast<UTexture2D>(NewAsset);
}
2015-08-05 15:54:57 -04:00
virtual void Cleanup ( )
{
CacheHandle = 0 ;
bProcessedCacheMiss = false ;
Asset = nullptr ;
}
2015-06-29 23:13:34 -04:00
public :
/** The asset version. Changing this will force a new version of the asset to get cached. */
UPROPERTY ( BlueprintReadWrite , Category = RuntimeAssetCache , meta = ( ExposeOnSpawn = " true " ) )
int32 AssetVersion ;
/** The name of the asset. This should be unique per asset, and is used to look it up from the cache. This should be something that can be known without having Asset in memory (so we can look it up in the cache). */
UPROPERTY ( BlueprintReadWrite , Category = RuntimeAssetCache , meta = ( ExposeOnSpawn = " true " ) )
FString AssetName ;
2015-08-05 15:54:57 -04:00
int32 CacheHandle ;
2015-06-29 23:13:34 -04:00
private :
UObject * Asset ;
2015-08-05 15:54:57 -04:00
int32 bProcessedCacheMiss : 1 ;
2015-06-29 23:13:34 -04:00
FOnRuntimeAssetCacheAsyncComplete GetFromCacheAsyncCompleteDelegate ;
FOnAssetCacheComplete OnAssetCacheComplete ;
} ;
2015-06-30 08:17:51 -04:00
UCLASS ( BlueprintType )
class UExampleTextureCacheBuilder : public URuntimeAssetCacheBuilder_ObjectBase
{
GENERATED_BODY ( )
public :
virtual void OnSetAsset ( UObject * NewAsset ) ;
virtual void OnAssetCacheMiss_Implementation ( ) override ;
virtual void SerializeAsset ( FArchive & Ar ) override ;
virtual void OnAssetPreLoad ( ) override ;
virtual void OnAssetPostLoad ( ) override ;
virtual int64 GetSerializedDataSizeEstimate ( ) override ;
UPROPERTY ( BlueprintReadOnly , Category = " Cache " )
2021-08-23 18:52:46 -04:00
TObjectPtr < UTexture2D > Texture ;
2015-06-30 08:17:51 -04:00
} ;