EM_Task/CoreUObject/Public/Misc/WorldCompositionUtility.h

135 lines
4.3 KiB
C
Raw Normal View History

2026-02-13 16:18:33 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
WorldCompositionUtility.h: Support structures for world composition
=============================================================================*/
#pragma once
#include "CoreMinimal.h"
#define WORLDTILE_LOD_PACKAGE_SUFFIX TEXT("_LOD")
#define WORLDTILE_LOD_MAX_INDEX 4
/** World layer information for tile tagging */
class FWorldTileLayer
{
public:
FWorldTileLayer()
: Name(TEXT("Uncategorized")), Reserved0(8000), Reserved1(ForceInit), StreamingDistance(15000), DistanceStreamingEnabled(true), IOSStreamingDistance(0)
{
}
bool operator==(const FWorldTileLayer& OtherLayer) const
{
return (Name == OtherLayer.Name) &&
(StreamingDistance == OtherLayer.StreamingDistance) &&
(DistanceStreamingEnabled == OtherLayer.DistanceStreamingEnabled);
}
friend FArchive& operator<<(FArchive& Ar, FWorldTileLayer& D);
friend void operator<<(FStructuredArchive::FSlot Slot, FWorldTileLayer& D);
public:
/** Human readable name for this layer */
FString Name;
int32 Reserved0;
FIntPoint Reserved1;
/** Distance starting from where tiles belonging to this layer will be streamed in */
int32 StreamingDistance;
bool DistanceStreamingEnabled;
int32 IOSStreamingDistance;
};
/**
* Describes LOD entry in a world tile
*/
class FWorldTileLODInfo
{
public:
FWorldTileLODInfo()
: RelativeStreamingDistance(10000), Reserved0(0), Reserved1(0), Reserved2(0), Reserved3(0)
{
}
friend FArchive& operator<<(FArchive& Ar, FWorldTileLayer& D);
friend void operator<<(FStructuredArchive::FSlot Slot, FWorldTileLayer& D);
bool operator==(const FWorldTileLODInfo& OtherInfo) const
{
return RelativeStreamingDistance == OtherInfo.RelativeStreamingDistance;
}
public:
/** Relative to LOD0 streaming distance, absolute distance = LOD0 + StreamingDistanceDelta */
int32 RelativeStreamingDistance;
/** Reserved for additional options */
float Reserved0;
float Reserved1;
int32 Reserved2;
int32 Reserved3;
};
/**
* Tile information used by WorldComposition.
* Defines properties necessary for tile positioning in the world. Stored with package summary
*/
class FWorldTileInfo
{
public:
FWorldTileInfo()
: Position(0, 0, 0), AbsolutePosition(0, 0, 0), Bounds(ForceInit), bHideInTileView(false), ZOrder(0), RealStreamingDistance(0)
{
}
COREUOBJECT_API friend FArchive& operator<<(FArchive& Ar, FWorldTileInfo& D);
COREUOBJECT_API friend void operator<<(FStructuredArchive::FSlot Slot, FWorldTileInfo& D);
bool operator==(const FWorldTileInfo& OtherInfo) const
{
return (Position == OtherInfo.Position) &&
(Bounds.Min.Equals(OtherInfo.Bounds.Min, 0.5f)) &&
(Bounds.Max.Equals(OtherInfo.Bounds.Max, 0.5f)) &&
(ParentTilePackageName == OtherInfo.ParentTilePackageName) &&
(Layer == OtherInfo.Layer) &&
(bHideInTileView == OtherInfo.bHideInTileView) &&
(ZOrder == OtherInfo.ZOrder) &&
(LODList == OtherInfo.LODList);
}
/** @return Streaming distance for a particular tile LOD */
int32 GetStreamingDistance(int32 LODIndex) const
{
int32 Distance = RealStreamingDistance;
if (LODList.IsValidIndex(LODIndex))
{
Distance += LODList[LODIndex].RelativeStreamingDistance;
}
return Distance;
}
/** Reads FWorldTileInfo from a specified package */
COREUOBJECT_API static bool Read(const FString& InPackageFileName, FWorldTileInfo& OutInfo);
public:
/** Tile position in the world relative to parent */
FIntVector Position;
/** Absolute tile position in the world. Calculated in runtime */
FIntVector AbsolutePosition;
/** Tile bounding box */
FBox Bounds;
/** Tile assigned layer */
FWorldTileLayer Layer;
/** Whether to hide sub-level tile in tile view*/
bool bHideInTileView;
/** Parent tile package name */
FString ParentTilePackageName;
/** LOD information */
TArray<FWorldTileLODInfo> LODList;
/** Sorting order */
int32 ZOrder;
int32 RealStreamingDistance;
};