545 lines
20 KiB
Ucode
545 lines
20 KiB
Ucode
/**
|
|
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
|
*/
|
|
class Texture2D extends Texture
|
|
native(Texture)
|
|
hidecategories(Object);
|
|
|
|
/**
|
|
* A mip-map of the texture.
|
|
*/
|
|
struct native Texture2DMipMap
|
|
{
|
|
var native UntypedBulkData_Mirror Data{FTextureMipBulkData};
|
|
var native int SizeX;
|
|
var native int SizeY;
|
|
|
|
structcpptext
|
|
{
|
|
/**
|
|
* Special serialize function passing the owning UObject along as required by FUnytpedBulkData
|
|
* serialization.
|
|
*
|
|
* @param Ar Archive to serialize with
|
|
* @param Owner UObject this structure is serialized within
|
|
* @param MipIdx Current mip being serialized
|
|
*/
|
|
void Serialize( FArchive& Ar, UObject* Owner, INT MipIdx );
|
|
}
|
|
};
|
|
|
|
/** The texture's mip-map data. */
|
|
var native const IndirectArray_Mirror Mips{TIndirectArray<FTexture2DMipMap>};
|
|
|
|
/** Cached PVRTC compressed texture data */
|
|
var native const IndirectArray_Mirror CachedPVRTCMips{TIndirectArray<FTexture2DMipMap>};
|
|
|
|
/** Cached ATITC compressed texture data */
|
|
var native const IndirectArray_Mirror CachedATITCMips{TIndirectArray<FTexture2DMipMap>};
|
|
|
|
/** Cached ETC compressed texture data */
|
|
var native const IndirectArray_Mirror CachedETCMips{TIndirectArray<FTexture2DMipMap>};
|
|
|
|
/** The size that the Flash compressed texture data was cached at */
|
|
var native const int CachedFlashMipsMaxResolution;
|
|
/** Cached Flash compressed texture data */
|
|
var native const UntypedBulkData_Mirror CachedFlashMips{FTextureMipBulkData};
|
|
|
|
/** The width of the texture. */
|
|
var const int SizeX;
|
|
|
|
/** The height of the texture. */
|
|
var const int SizeY;
|
|
|
|
/** The original width of the texture source art we imported from. */
|
|
var const int OriginalSizeX;
|
|
|
|
/** The original height of the texture source art we imported from. */
|
|
var const int OriginalSizeY;
|
|
|
|
|
|
/** The format of the texture data. */
|
|
var const EPixelFormat Format;
|
|
|
|
/** The addressing mode to use for the X axis. */
|
|
var() TextureAddress AddressX;
|
|
|
|
/** The addressing mode to use for the Y axis. */
|
|
var() TextureAddress AddressY;
|
|
|
|
/** Is this texture editor only, and should not be cooked into the final packages */
|
|
var() const bool bIsEditorOnly;
|
|
|
|
/** Whether the texture is currently streamable or not. */
|
|
var transient const bool bIsStreamable;
|
|
/** Whether the current texture mip change request is pending cancelation. */
|
|
var transient const bool bHasCancelationPending;
|
|
/**
|
|
* Whether the texture has been loaded from a persistent archive. We keep track of this in order to not stream
|
|
* textures that are being re-imported over as they will have a linker but won't have been serialized from disk
|
|
* and are therefore not streamable.
|
|
*/
|
|
var transient const bool bHasBeenLoadedFromPersistentArchive;
|
|
|
|
/** Override whether to fully stream even if texture hasn't been rendered. */
|
|
var transient bool bForceMiplevelsToBeResident;
|
|
/** Global/ serialized version of ForceMiplevelsToBeResident. */
|
|
var() const bool bGlobalForceMipLevelsToBeResident;
|
|
/** WorldInfo timestamp that tells the streamer to force all miplevels to be resident up until that time. */
|
|
var private transient float ForceMipLevelsToBeResidentTimestamp;
|
|
|
|
/** Allows texture to be a source for Texture2DComposite. Will NOT be available for use in rendering! */
|
|
var() const bool bIsCompositingSource;
|
|
|
|
/** Whether the texture has been painted in the editor. */
|
|
var editoronly bool bHasBeenPaintedInEditor;
|
|
|
|
/** Name of texture file cache texture mips are stored in, NAME_None if it is not part of one. */
|
|
var name TextureFileCacheName;
|
|
/** ID generated whenever the texture is changed so that its bulk data can be updated in the TextureFileCache during cook */
|
|
var native const guid TextureFileCacheGuid;
|
|
|
|
/** Number of miplevels the texture should have resident. */
|
|
var transient const int RequestedMips;
|
|
/** Number of miplevels currently resident. */
|
|
var transient const int ResidentMips;
|
|
|
|
/** Number of mips to remove when recompressing (does not work with TC_NormalmapUncompressed) */
|
|
var() int MipsToRemoveOnCompress;
|
|
|
|
/** Command fence used to shut down properly */
|
|
var native const pointer ReleaseTexture2DFence{class FRenderCommandFence};
|
|
|
|
/**
|
|
* Thread-safe counter indicating the texture streaming state. The definitions below are mirrored in UnTex.h.
|
|
*
|
|
enum ETextureStreamingState
|
|
{
|
|
// The renderer hasn't created the resource yet.
|
|
TexState_InProgress_Initialization = -1,
|
|
// There are no pending requests/ all requests have been fulfilled.
|
|
TexState_ReadyFor_Requests = 0,
|
|
// Finalization has been kicked off and is in progress.
|
|
TexState_InProgress_Finalization = 1,
|
|
// Initial request has completed and finalization needs to be kicked off.
|
|
TexState_ReadyFor_Finalization = 2,
|
|
// We're currently loading in mip data.
|
|
TexState_InProgress_Loading = 3,
|
|
// ...
|
|
// States 3+N means we're currently loading in N mips
|
|
// ...
|
|
// Memory has been allocated and we're ready to start loading in mips.
|
|
TexState_ReadyFor_Loading = 100,
|
|
// We're currently allocating/preparing memory for the new mip count.
|
|
TexState_InProgress_Allocating = 101,
|
|
};
|
|
*/
|
|
var native transient const ThreadSafeCounter PendingMipChangeRequestStatus{mutable FThreadSafeCounter};
|
|
|
|
/** Data formatted only for 1 bit textures which are CPU based and never allocate GPU Memory **/
|
|
var private{private} array<byte> SystemMemoryData;
|
|
|
|
/**
|
|
* Mirror helper structure for linked list of texture objects. The linked list should NOT be traversed by the
|
|
* garbage collector, which is why Element is declared as a pointer.
|
|
*/
|
|
struct TextureLinkedListMirror
|
|
{
|
|
var native const POINTER Element;
|
|
var native const POINTER Next;
|
|
var native const POINTER PrevLink;
|
|
};
|
|
|
|
/** This texture's link in the global streamable texture list. */
|
|
var private{private} native const duplicatetransient noimport TextureLinkedListMirror StreamableTexturesLink{TLinkedList<UTexture2D*>};
|
|
|
|
/** FStreamingTexture index used by the texture streaming system. */
|
|
var private{private} const transient duplicatetransient int StreamingIndex;
|
|
|
|
/**
|
|
* Keep track of the first mip level stored in the packed miptail.
|
|
* it's set to highest mip level if no there's no packed miptail
|
|
*/
|
|
var const int MipTailBaseIdx;
|
|
|
|
/** memory used for directly loading bulk mip data */
|
|
var private const native transient pointer ResourceMem{FTexture2DResourceMem};
|
|
/** keep track of first mip level used for ResourceMem creation */
|
|
var private const int FirstResourceMemMip;
|
|
|
|
/** Used for various timing measurements, e.g. streaming latency. */
|
|
var private const native transient float Timer;
|
|
|
|
/**
|
|
* Tells the streaming system that it should force all mip-levels to be resident for a number of seconds.
|
|
* @param Seconds Duration in seconds
|
|
* @param CinematicTextureGroups Bitfield indicating which texture groups that use extra high-resolution mips
|
|
*/
|
|
native final function SetForceMipLevelsToBeResident( float Seconds, optional int CinematicTextureGroups = 0 );
|
|
|
|
cpptext
|
|
{
|
|
// Static private variables.
|
|
private:
|
|
/** First streamable texture link. Not handled by GC as BeginDestroy automatically unlinks. */
|
|
static TLinkedList<UTexture2D*>* FirstStreamableLink;
|
|
/** Current streamable texture link for iteration over textures. Not handled by GC as BeginDestroy automatically unlinks. */
|
|
static TLinkedList<UTexture2D*>* CurrentStreamableLink;
|
|
/** Number of streamable textures. */
|
|
static INT NumStreamableTextures;
|
|
|
|
public:
|
|
|
|
// UObject interface.
|
|
void InitializeIntrinsicPropertyValues();
|
|
void Serialize(FArchive& Ar) override;
|
|
#if !CONSOLE
|
|
// SetLinker is only virtual on consoles.
|
|
void SetLinker( ULinkerLoad* L, INT I ) override;
|
|
#endif
|
|
void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
|
|
|
|
/**
|
|
* Called after the garbage collection mark phase on unreachable objects.
|
|
*/
|
|
void BeginDestroy() override;
|
|
UBOOL IsReadyForFinishDestroy() override;
|
|
void FinishDestroy() override;
|
|
|
|
/**
|
|
* Called after object and all its dependencies have been serialized.
|
|
*/
|
|
void PostLoad() override;
|
|
/**
|
|
* Called after object has been duplicated.
|
|
*/
|
|
void PostDuplicate() override;
|
|
|
|
/**
|
|
* Generates a GUID for the texture if one doesn't already exist.
|
|
*
|
|
* @param bForceGeneration Whether we should generate a GUID even if it is already valid.
|
|
*/
|
|
void GenerateTextureFileCacheGUID(UBOOL bForceGeneration=FALSE);
|
|
|
|
// USurface interface
|
|
FLOAT GetSurfaceWidth() const override { return SizeX; }
|
|
FLOAT GetSurfaceHeight() const override { return SizeY; }
|
|
|
|
/**
|
|
* @return Width/height this surface was before cooking or other modifications
|
|
*/
|
|
FLOAT GetOriginalSurfaceWidth() const override { return OriginalSizeX; }
|
|
FLOAT GetOriginalSurfaceHeight() const override { return OriginalSizeY; }
|
|
|
|
// UTexture interface.
|
|
FTextureResource* CreateResource() override;
|
|
void Compress() override;
|
|
EMaterialValueType GetMaterialType() override { return MCT_Texture2D; }
|
|
|
|
/**
|
|
* Scale the actual texture data of the top mip. This allows non-uniform scaling - use with care :)
|
|
*/
|
|
void ResizeTexture(const FVector2D& Scale);
|
|
void ResizeTexture(FLOAT Scale)
|
|
{
|
|
FVector2D Scale2D(Scale, Scale);
|
|
ResizeTexture(Scale2D);
|
|
}
|
|
|
|
/**
|
|
* Creates a new resource for the texture, and updates any cached references to the resource.
|
|
*/
|
|
void UpdateResource() override;
|
|
|
|
/**
|
|
* Used by various commandlets to purge editor only and platform-specific data from various objects
|
|
*
|
|
* @param PlatformsToKeep Platforms for which to keep platform-specific data
|
|
* @param bStripLargeEditorData If TRUE, data used in the editor, but large enough to bloat download sizes, will be removed
|
|
*/
|
|
void StripData(UE3::EPlatformType PlatformsToKeep, UBOOL bStripLargeEditorData) override;
|
|
|
|
/**
|
|
* Gets the average brightness of the texture in linear space
|
|
*
|
|
* @param bIgnoreTrueBlack If TRUE, then pixels w/ 0,0,0 rgb values do not contribute.
|
|
* @param bUseGrayscale If TRUE, use gray scale else use the max color component.
|
|
*
|
|
* @return FLOAT The average brightness of the texture
|
|
*/
|
|
FLOAT GetAverageBrightness(UBOOL bIgnoreTrueBlack, UBOOL bUseGrayscale) override;
|
|
|
|
// UTexture2D interface.
|
|
void Init(UINT InSizeX,UINT InSizeY,EPixelFormat InFormat);
|
|
void LegacySerialize(FArchive& Ar);
|
|
|
|
/**
|
|
* return the texture/pixel format that should be used internally for an incoming texture load request, if different onload conversion is required
|
|
*
|
|
* @param Format source texture format
|
|
* @param Platform destination platform, useful during cooking
|
|
*/
|
|
static EPixelFormat GetEffectivePixelFormat( const EPixelFormat Format, UBOOL bSRGB, UE3::EPlatformType Platform = UE3::PLATFORM_Unknown );
|
|
|
|
/**
|
|
* Returns a one line description of an object for viewing in the thumbnail view of the generic browser
|
|
*/
|
|
FString GetDesc() override;
|
|
|
|
/**
|
|
* Returns detailed info to populate listview columns
|
|
*/
|
|
FString GetDetailedDescription( INT InIndex ) override;
|
|
|
|
/**
|
|
* Calculates the size of this texture in bytes if it had MipCount miplevels streamed in.
|
|
*
|
|
* @param MipCount Number of mips to calculate size for, counting from the smallest 1x1 mip-level and up.
|
|
* @return Size of MipCount mips in bytes
|
|
*/
|
|
INT CalcTextureMemorySize( INT MipCount ) const;
|
|
|
|
/**
|
|
* Calculates the size of this texture if it had MipCount miplevels streamed in.
|
|
*
|
|
* @param MipCount Which mips to calculate size for.
|
|
* @return Total size of all specified mips, in bytes
|
|
*/
|
|
INT CalcTextureMemorySize( ETextureMipCount MipCount ) const override;
|
|
|
|
/**
|
|
* Returns the size of this texture in bytes on 360 if it had MipCount miplevels streamed in.
|
|
*
|
|
* @param MipCount Number of toplevel mips to calculate size for
|
|
* @return size of top mipcount mips in bytes
|
|
*/
|
|
INT Get360Size( INT MipCount ) const;
|
|
|
|
/**
|
|
* Get the CRC of the source art pixels.
|
|
*
|
|
* @param [out] OutSourceCRC The CRC value of the source art pixels.
|
|
*
|
|
* @return UBOOL TRUE if successful, FALSE if failed (or no source art)
|
|
*/
|
|
UBOOL GetSourceArtCRC(DWORD& OutSourceCRC);
|
|
|
|
/**
|
|
* Returns whether or not the texture has source art at all
|
|
*
|
|
* @return TRUE if the texture has source art. FALSE, otherwise.
|
|
*/
|
|
UBOOL HasSourceArt() const override;
|
|
|
|
/**
|
|
* Compresses the source art, if needed
|
|
*/
|
|
void CompressSourceArt() override;
|
|
|
|
/**
|
|
* Returns uncompressed source art.
|
|
*
|
|
* @param OutSourceArt [out]A buffer containing uncompressed source art.
|
|
*/
|
|
void GetUncompressedSourceArt( TArray<BYTE>& OutSourceArt ) override;
|
|
|
|
/**
|
|
* Sets the given buffer as the uncompressed source art.
|
|
*
|
|
* @param UncompressedData Uncompressed source art data.
|
|
* @param DataSize Size of the UncompressedData.
|
|
*/
|
|
void SetUncompressedSourceArt( const void* UncompressedData, INT DataSize ) override;
|
|
|
|
/**
|
|
* Sets the given buffer as the compressed source art.
|
|
*
|
|
* @param CompressedData Compressed source art data.
|
|
* @param DataSize Size of the CompressedData.
|
|
*/
|
|
void SetCompressedSourceArt( const void* CompressedData, INT DataSize ) override;
|
|
|
|
/**
|
|
* See if the source art of the two textures matches...
|
|
*
|
|
* @param InTexture The texture to compare it to
|
|
*
|
|
* @return UBOOL TRUE if they matche, FALSE if not
|
|
*/
|
|
UBOOL HasSameSourceArt(UTexture2D* InTexture);
|
|
|
|
UBOOL HasAlphaChannel() const
|
|
{
|
|
return Format == PF_A8R8G8B8 || Format == PF_DXT3 || Format == PF_DXT5;
|
|
}
|
|
|
|
/**
|
|
* Returns if the texture should be automatically biased to -1..1 range
|
|
*/
|
|
UBOOL BiasNormalMap() const;
|
|
|
|
/**
|
|
* Returns whether the texture is ready for streaming aka whether it has had InitRHI called on it.
|
|
*
|
|
* @return TRUE if initialized and ready for streaming, FALSE otherwise
|
|
*/
|
|
//@zombie_ps4_begin
|
|
FORCEINLINE UBOOL IsReadyForStreaming()
|
|
{
|
|
// A value < 0 indicates that the resource is still in the process of being created
|
|
// for the first time.
|
|
return PendingMipChangeRequestStatus.GetValue() != TexState_InProgress_Initialization;
|
|
}
|
|
//@zombie_ps4_end
|
|
|
|
/**
|
|
* Waits until all streaming requests for this texture has been fully processed.
|
|
*/
|
|
void WaitForStreaming() override;
|
|
|
|
/**
|
|
* Updates the streaming status of the texture and performs finalization when appropriate. The function returns
|
|
* TRUE while there are pending requests in flight and updating needs to continue.
|
|
*
|
|
* @param bWaitForMipFading Whether to wait for Mip Fading to complete before finalizing.
|
|
* @return TRUE if there are requests in flight, FALSE otherwise
|
|
*/
|
|
UBOOL UpdateStreamingStatus( UBOOL bWaitForMipFading = FALSE ) override;
|
|
|
|
/**
|
|
* Tries to cancel a pending mip change request. Requests cannot be canceled if they are in the
|
|
* finalization phase.
|
|
*
|
|
* @param TRUE if cancelation was successful, FALSE otherwise
|
|
*/
|
|
UBOOL CancelPendingMipChangeRequest();
|
|
|
|
/**
|
|
* Returns the size of the object/ resource for display to artists/ LDs in the Editor.
|
|
*
|
|
* @return size of resource as to be displayed to artists/ LDs in the Editor.
|
|
*/
|
|
INT GetResourceSize() override;
|
|
|
|
/**
|
|
* Returns whether miplevels should be forced resident.
|
|
*
|
|
* @return TRUE if either transient or serialized override requests miplevels to be resident, FALSE otherwise
|
|
*/
|
|
UBOOL ShouldMipLevelsBeForcedResident() const;
|
|
|
|
/**
|
|
* Whether all miplevels of this texture have been fully streamed in, LOD settings permitting.
|
|
*/
|
|
UBOOL IsFullyStreamedIn();
|
|
|
|
/**
|
|
* Returns a reference to the global list of streamable textures.
|
|
*
|
|
* @return reference to global list of streamable textures.
|
|
*/
|
|
static TLinkedList<UTexture2D*>*& GetStreamableList();
|
|
|
|
/**
|
|
* Returns a reference to the current streamable link.
|
|
*
|
|
* @return reference to current streamable link
|
|
*/
|
|
static TLinkedList<UTexture2D*>*& GetCurrentStreamableLink();
|
|
|
|
/**
|
|
* Links texture to streamable list and updates streamable texture count.
|
|
*/
|
|
void LinkStreaming();
|
|
|
|
/**
|
|
* Unlinks texture from streamable list, resets CurrentStreamableLink if it matches
|
|
* StreamableTexturesLink and also updates the streamable texture count.
|
|
*/
|
|
void UnlinkStreaming();
|
|
|
|
/**
|
|
* Returns the number of streamable textures, maintained by link/ unlink code
|
|
*
|
|
* @return Number of streamable textures
|
|
*/
|
|
static INT GetNumStreamableTextures();
|
|
|
|
/**
|
|
* Cancels any pending texture streaming actions if possible.
|
|
* Returns when no more async loading requests are in flight.
|
|
*/
|
|
static void CancelPendingTextureStreaming();
|
|
|
|
/**
|
|
* Initialize the GPU resource memory that will be used for the bulk mip data
|
|
* This memory is allocated based on the SizeX,SizeY of the texture and the first mip used
|
|
*
|
|
* @param FirstMipIdx first mip that will be resident
|
|
* @return FTexture2DResourceMem container for the allocated GPU resource mem
|
|
*/
|
|
class FTexture2DResourceMem* InitResourceMem(INT FirstMipIdx);
|
|
|
|
/**
|
|
* Calculates and returns the corresponding ResourceMem parameters for this texture.
|
|
*
|
|
* @param FirstMipIdx Index of the largest mip-level stored within a seekfree (level) package
|
|
* @param OutSizeX [out] Width of the stored largest mip-level
|
|
* @param OutSizeY [out] Height of the stored largest mip-level
|
|
* @param OutNumMips [out] Number of stored mips
|
|
* @param OutTexCreateFlags [out] ETextureCreateFlags bit flags
|
|
* @return TRUE if the texture should use a ResourceMem. If FALSE, none of the out parameters will be filled in.
|
|
*/
|
|
UBOOL GetResourceMemSettings(INT FirstMipIdx, INT& OutSizeX, INT& OutSizeY, INT& OutNumMips, DWORD& OutTexCreateFlags);
|
|
|
|
/**
|
|
* Creates a platform-specific ResourceMem. If an AsyncCounter is provided, it will allocate asynchronously.
|
|
*
|
|
* @param SizeX Width of the stored largest mip-level
|
|
* @param SizeY Height of the stored largest mip-level
|
|
* @param NumMips Number of stored mips
|
|
* @param TexCreateFlags ETextureCreateFlags bit flags
|
|
* @param AsyncCounter If specified, starts an async allocation. If NULL, allocates memory immediately.
|
|
* @return Platform-specific ResourceMem.
|
|
*/
|
|
static FTexture2DResourceMem* CreateResourceMem(INT SizeX, INT SizeY, INT NumMips, EPixelFormat Format, DWORD TexCreateFlags, FThreadSafeCounter* AsyncCounter);
|
|
|
|
#if WITH_EDITOR
|
|
/** Recreates system memory data for textures that do not use GPU resources (1 bit textures). Should be called when data in the top level mip changes **/
|
|
void UpdateSystemMemoryData();
|
|
|
|
/**
|
|
* Asynchronously update a set of regions of a texture with new data.
|
|
* @param MipIndex - the mip number to update
|
|
* @param NumRegions - number of regions to update
|
|
* @param Regions - regions to update
|
|
* @param SrcPitch - the pitch of the source data in bytes
|
|
* @param SrcBpp - the size one pixel data in bytes
|
|
* @param SrcData - the source data
|
|
* @param bFreeData - if TRUE, the SrcData and Regions pointers will be freed after the update.
|
|
*/
|
|
void UpdateTextureRegions( INT MipIndex, UINT NumRegions, FUpdateTextureRegion2D* Regions, UINT SrcPitch, UINT SrcBpp, BYTE* SrcData, UBOOL bFreeData );
|
|
#endif
|
|
|
|
/** Called after an editor or undo operation is formed on texture
|
|
*/
|
|
void PostEditUndo() override;
|
|
|
|
/** Returns system memory data for read only purposes **/
|
|
const TArray<BYTE>& AccessSystemMemoryData() const { return SystemMemoryData; }
|
|
|
|
friend struct FStreamingManagerTexture;
|
|
friend struct FStreamingTexture;
|
|
}
|
|
|
|
/** creates and initializes a new Texture2D with the requested settings */
|
|
static native noexport final function Texture2D Create(int InSizeX, int InSizeY, optional EPixelFormat InFormat = PF_A8R8G8B8);
|
|
|
|
defaultproperties
|
|
{
|
|
StreamingIndex=-1
|
|
MipsToRemoveOnCompress=0
|
|
bIsEditorOnly=false
|
|
}
|