1
0
KF2-Dev-Scripts/Engine/Classes/InstancedStaticMeshComponent.uc

176 lines
5.8 KiB
Ucode
Raw Permalink Normal View History

2020-12-13 15:01:13 +00:00
/**
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class InstancedStaticMeshComponent extends StaticMeshComponent
native(Mesh);
struct immutablewhencooked native InstancedStaticMeshInstanceData
{
var matrix Transform;
var vector2d LightmapUVBias;
var vector2d ShadowmapUVBias;
structcpptext
{
// Serialization
friend FArchive& operator<<(FArchive& Ar, FInstancedStaticMeshInstanceData& InstanceData)
{
// @warning BulkSerialize: FInstancedStaticMeshInstanceData is serialized as memory dump
// See TArray::BulkSerialize for detailed description of implied limitations.
Ar << InstanceData.Transform << InstanceData.LightmapUVBias << InstanceData.ShadowmapUVBias;
return Ar;
}
}
};
struct native InstancedStaticMeshMappingInfo
{
var native pointer Mapping{class FInstancedStaticMeshStaticLightingTextureMapping};
var native pointer Lightmap{class FInstancedLightMap2D};
var texture2d LightmapTexture;
var shadowmap2d ShadowmapTexture;
};
/** Deprecated array of instances, script serialized */
var deprecated array<InstancedStaticMeshInstanceData> PerInstanceData;
/** Array of instances, bulk serialized */
var native array<InstancedStaticMeshInstanceData> PerInstanceSMData;
/** Number of pending lightmaps still to be calculated (Apply()'d) */
var transient int NumPendingLightmaps;
/**
* A key for deciding which components are compatible when joining components together after a lighting build.
* Will default to the staticmesh pointer when SetStaticMesh is called, so this must be set after calling
* SetStaticMesh on the component
*/
var int ComponentJoinKey;
/** The mappings for all the instances of this component */
var transient array<InstancedStaticMeshMappingInfo> CachedMappings;
/** Value used to seed the random number stream that generates random numbers for each of this mesh's instances.
The random number is stored in a buffer accessible to materials through the PerInstanceRandom expression. If
this is set to zero (default), it will be populated automatically by the editor */
var() int InstancingRandomSeed;
/** Distance from camera at which each instance begins to fade out */
var(Culling) int InstanceStartCullDistance;
/** Distance from camera at which each instance completely fades out */
var(Culling) int InstanceEndCullDistance;
/** One bit per instance to show selection in the editor */
var editoronly native const BitArray_Mirror SelectedInstances{TBitArray<>};
/** Flag to prevent split up/join components into multiple components after building lighting */
var bool bDontResolveInstancedLightmaps;
cpptext
{
virtual FPrimitiveSceneProxy* CreateSceneProxy();
virtual void UpdateBounds();
virtual void GetStaticLightingInfo(FStaticLightingPrimitiveInfo& OutPrimitiveInfo,const TArray<ULightComponent*>& InRelevantLights,const FLightingBuildOptions& Options);
void UpdateInstances();
void ApplyAllMappings();
static TSet<AActor*> ActorsWithInstancedComponents;
static void ResolveInstancedLightmaps(UBOOL bWasLightingSuccessful, UBOOL bIgnoreTextureForBatching=FALSE);
static void ResolveInstancedLightmapsForActor(AActor* InActor, UBOOL bWasLightingSuccessful, UBOOL bIgnoreTextureForBatching=FALSE);
virtual void GetLightAndShadowMapMemoryUsage( INT& LightMapMemoryUsage, INT& ShadowMapMemoryUsage ) const;
/**
* Serialize function.
*
* @param Ar Archive to serialize with
*/
virtual void Serialize(FArchive& Ar);
/**
* Returns whether or not this component is instanced.
*
* @return TRUE if this component represents multiple instances of a primitive.
*/
virtual UBOOL IsPrimitiveInstanced() const
{
return TRUE;
}
/**
* For instanced components, returns the number of instances.
*
* @return Number of instances
*/
virtual INT GetInstanceCount() const
{
return PerInstanceSMData.Num();
}
/**
* Returns whether this primitive should render selection.
*/
virtual UBOOL ShouldRenderSelected() const
{
return UPrimitiveComponent::ShouldRenderSelected()
#if WITH_EDITORONLY_DATA
// Also render selected if we have an array of selected instances
|| SelectedInstances.Num() > 0
#endif
;
}
/**
* For instanced components, returns the Local -> World transform for the specific instance number.
* If the function is called on non-instanced components, the component's LocalToWorld will be returned.
* You should override this method in derived classes that support instancing.
*
* @param InInstanceIndex The index of the instance to return the Local -> World transform for
*
* @return Number of instances
*/
virtual const FMatrix GetInstanceLocalToWorld( INT InInstanceIndex ) const
{
return PerInstanceSMData( InInstanceIndex ).Transform * LocalToWorld;
}
virtual void InitComponentRBPhys(UBOOL bFixed);
#if STATS
/**
* Called after all objects referenced by this object have been serialized. Order of PostLoad routed to
* multiple objects loaded in one set is not deterministic though ConditionalPostLoad can be forced to
* ensure an object has been "PostLoad"ed.
*/
virtual void PostLoad();
/**
* Informs object of pending destruction via GC.
*/
void BeginDestroy();
/**
* Attaches the component to a ParentToWorld transform, owner and scene.
* Requires IsValidComponent() == true.
*/
virtual void Attach();
/**
* Detaches the component from the scene it is in.
* Requires bAttached == true
*
* @param bWillReattach TRUE is passed if Attach will be called immediately afterwards. This can be used to
* preserve state between reattachments.
*/
virtual void Detach( UBOOL bWillReattach = FALSE );
#endif
}
defaultproperties
{
bSupportedOnMobile=FALSE
}