1
0
KF2-Dev-Scripts/Engine/Classes/TerrainComponent.uc
2020-12-13 18:01:13 +03:00

271 lines
8.6 KiB
Ucode

/**
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class TerrainComponent extends PrimitiveComponent
native(Terrain);
/** INTERNAL: Array of shadow map data applied to the terrain component. */
var private const array<ShadowMap2D> ShadowMaps;
/** INTERNAL: Array of lights that don't apply to the terrain component. */
var const array<Guid> IrrelevantLights;
var const native transient pointer TerrainObject{struct FTerrainObject};
var const int SectionBaseX,
SectionBaseY,
SectionSizeX,
SectionSizeY;
/** The actual section size in vertices... */
var const int TrueSectionSizeX;
var const int TrueSectionSizeY;
var native private const LightMapRef LightMap;
struct TerrainPatchBounds
{
var float MinHeight;
var float MaxHeight;
var float MaxDisplacement;
};
struct TerrainMaterialMask
{
var qword BitMask;
var int NumBits;
};
var private const native transient array<TerrainPatchBounds> PatchBounds;
var private const native transient array<TerrainMaterialMask> BatchMaterials;
var private const native transient int FullBatch;
/** Place holder structure that mirrors the byte size needed for a BV tree. */
struct TerrainBVTree
{
var private const native array<int> Nodes;
};
/** Used for in-game collision tests against terrain. */
var private const native transient TerrainBVTree BVTree;
/**
* This is a low poly version of the terrain vertices in world space. The
* triangle data is created based upon Terrain->CollisionTesselationLevel
*/
var private const native transient array<vector> CollisionVertices;
/**
* Physics engine version of heightfield data.
* User first version for PhysX-2.8.x, second for PhysX-3.x
*/
/*var const native pointer RBHeightfield{class NxHeightField};*/
var const native pointer RBHeightfield{class PxHeightField};
/**
* Indicates the the terrain collision level should be rendered.
*/
var private const bool bDisplayCollisionLevel;
cpptext
{
/**
* Builds the collision data for this terrain
*/
void BuildCollisionData(void);
/**
* @return Whether or not the collision data for this component is dirty.
*/
UBOOL IsCollisionDataDirty() const
{
// @todo: Replace this with a proper flag, this is only a stub function right now.
return TRUE;
}
// UObject interface.
virtual void AddReferencedObjects( TArray<UObject*>& ObjectArray );
virtual void Serialize( FArchive& Ar );
virtual void PostLoad();
virtual void FinishDestroy();
/**
* @return Sum of the size of textures referenced by this material.
*/
virtual INT GetResourceSize();
/**
* Rebuilds the collision data for saving
*/
virtual void PreSave(void);
// UPrimitiveComponent interface.
virtual UBOOL PointCheck(FCheckResult& Result,const FVector& Location,const FVector& Extent,DWORD TraceFlags);
virtual UBOOL LineCheck(FCheckResult& Result,const FVector& End,const FVector& Start,const FVector& Extent,DWORD TraceFlags);
virtual void UpdateBounds();
/**
* Retrieves the materials used in this component
*
* @param OutMaterials The list of used materials.
*/
virtual void GetUsedMaterials( TArray<UMaterialInterface*>& OutMaterials ) const;
virtual void InitComponentRBPhys(UBOOL bFixed);
/**
* Returns the MAX number of triangle this component will render.
*
* @return UINT Maximum number of triangle that could be rendered.
*/
virtual UINT GetMaxTriangleCount( ) const;
/**
* Returns the lightmap resolution used for this primivite instnace in the case of it supporting texture light/ shadow maps.
* 0 if not supported or no static shadowing.
*
* @param Width [out] Width of light/shadow map
* @param Height [out] Height of light/shadow map
*
* @return UBOOL TRUE if LightMap values are padded, FALSE if not
*/
virtual UBOOL GetLightMapResolution( INT& Width, INT& Height ) const;
/**
* Returns the static lightmap resolution used for this primitive.
* 0 if not supported or no static shadowing.
*
* @return INT The StaticLightmapResolution for the component
*/
virtual INT GetStaticLightMapResolution() const;
/**
* Returns the light and shadow map memory for this primite in its out variables.
*
* Shadow map memory usage is per light whereof lightmap data is independent of number of lights, assuming at least one.
*
* @param [out] LightMapMemoryUsage Memory usage in bytes for light map (either texel or vertex) data
* @param [out] ShadowMapMemoryUsage Memory usage in bytes for shadow map (either texel or vertex) data
*/
virtual void GetLightAndShadowMapMemoryUsage( INT& LightMapMemoryUsage, INT& ShadowMapMemoryUsage ) const;
/**
* Retrieve various actor metrics depending on the provided type. All of
* these will total the values for this component.
*
* @param MetricsType The type of metric to calculate.
*
* METRICS_VERTS - Get the number of vertices.
* METRICS_TRIS - Get the number of triangles.
* METRICS_SECTIONS - Get the number of sections.
*
* @return INT The total of the given type for this component.
*/
virtual INT GetActorMetrics(EActorMetricsType MetricsType);
friend struct FTerrainObject;
friend class FTerrainComponentSceneProxy;
// UActorComponent interface.
protected:
virtual void SetParentToWorld(const FMatrix& ParentToWorld);
virtual void Attach();
virtual void UpdateTransform();
virtual void Detach( UBOOL bWillReattach = FALSE );
/**
* Only valid for cases when the primitive will be reattached
* @return TRUE if the base primitive component should handle reattaching decals when the primitive is attached
*/
virtual UBOOL AllowDecalAutomaticReAttach() const
{
// always detach decals for terrain since we trigger a manual reattach
return FALSE;
}
public:
virtual void InvalidateLightingCache();
#if __TW_PRECOMPUTED_VISIBILITY_
virtual void InvalidatePrecomputedVisibility()
{
MarkPrecomputedVisibilityRequiringRebuild();
}
#endif
// UPrimitiveComponent interface.
virtual void GenerateDecalRenderData(class FDecalState* Decal, TArray< FDecalRenderData* >& OutDecalRenderDatas) const;
virtual void GetStaticLightingInfo(FStaticLightingPrimitiveInfo& OutPrimitiveInfo,const TArray<ULightComponent*>& InRelevantLights,const FLightingBuildOptions& Options);
/**
* Requests whether the component will use texture, vertex or no lightmaps.
*
* @return ELightMapInteractionType The type of lightmap interaction the component will use.
*/
virtual ELightMapInteractionType GetStaticLightingType() const { return LMIT_Texture; }
virtual void GetStaticTriangles(FPrimitiveTriangleDefinitionInterface* PTDI) const;
virtual void GetStreamingTextureInfo(TArray<FStreamingTexturePrimitiveInfo>& OutStreamingTextures) const;
// Init
void Init(INT InBaseX,INT InBaseY,INT InSizeX,INT InSizeY,INT InTrueSizeX,INT InTrueSizeY);
// UpdatePatchBounds
void UpdatePatchBounds();
/** builds/updates a list of unique blended material combinations used by quads in this terrain section and puts them in the PatchBatches array.
* Also updates FullBatch with the index of the mask for the full set.
*/
void UpdatePatchBatches();
/** Return's the terrain actor associated with the terrain component. */
class ATerrain* GetTerrain() const
{
return CastChecked<ATerrain>(GetOuter());
}
/** Returns a vertex in the component's local space. */
FVector GetLocalVertex(INT X,INT Y) const;
/** Returns a vertex in the component's local space. */
FVector GetWorldVertex(INT X,INT Y) const;
//
void RenderPatches(const FSceneView* View,FPrimitiveDrawInterface* PDI);
/**
* Gets the terrain collision data needed to pass to Novodex or to the
* kDOP code. Note: this code generates vertices/indices based on the
* Terrain->CollisionTessellationLevel
*
* @param OutVertices [out] The array that gets each vert in the terrain
* @param OutIndices [out] The array that holds the generated indices
*/
void GetCollisionData(TArray<FVector>& OutVertices,TArray<INT>& OutIndices) const;
virtual FPrimitiveSceneProxy* CreateSceneProxy();
UINT GetTriangleCount();
UINT GetTriangleCountForDecal( UDecalComponent * DecalComponent );
}
defaultproperties
{
CollideActors=TRUE
BlockActors=TRUE
BlockZeroExtent=TRUE
BlockNonZeroExtent=TRUE
BlockRigidBody=TRUE
CastShadow=TRUE
bAcceptsLights=TRUE
bAcceptsDecals=TRUE
bAcceptsStaticDecals=TRUE
bUsePrecomputedShadows=TRUE
bUseAsOccluder=TRUE
bAllowCullDistanceVolume=FALSE
}