UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
LODActor.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
12#include "LODActor.generated.h"
13
14class UStaticMesh;
15class UHLODProxy;
16class UHLODProxyDesc;
17
19
23USTRUCT()
25{
27
28 UPROPERTY()
30
31 UPROPERTY()
33
35 : StaticMesh()
36 , Material()
37 {}
38
43
45 {
46 return StaticMesh == Other.StaticMesh && Material == Other.Material;
47 }
48
49 bool IsValid() const
50 {
51 return StaticMesh != nullptr && Material != nullptr;
52 }
53
55 {
56 return HashCombine(GetTypeHash(Key.StaticMesh), GetTypeHash(Key.Material));
57 }
58};
59
68UCLASS(notplaceable, hidecategories = (Object, Collision, Display, Input, Blueprint, Transform, Physics), MinimalAPI)
70{
72
75
77 // disable display of this component
78 UPROPERTY(Category=LODActor, VisibleAnywhere)
79 TObjectPtr<UStaticMeshComponent> StaticMeshComponent;
80
83 TMap<FHLODInstancingKey, TObjectPtr<UInstancedStaticMeshComponent>> InstancedStaticMeshComponents;
84
86 UPROPERTY(Category=LODActor, VisibleAnywhere)
88
90 UPROPERTY(Category=LODActor, VisibleAnywhere)
91 FName Key;
92
94 UPROPERTY(Category = LODActor, VisibleAnywhere)
95 float LODDrawDistance;
96
97public:
99 UPROPERTY(Category=LODActor, VisibleAnywhere)
100 int32 LODLevel;
101
102 UPROPERTY(Category=LODActor, VisibleAnywhere)
104
105 UPROPERTY()
106 uint8 CachedNumHLODLevels;
107
108 //~ Begin AActor Interface
109#if WITH_EDITOR
110 ENGINE_API virtual void CheckForErrors() override;
111 ENGINE_API virtual void EditorApplyTranslation(const FVector& DeltaTranslation, bool bAltDown, bool bShiftDown, bool bCtrlDown) override;
112 ENGINE_API virtual void EditorApplyRotation(const FRotator& DeltaRotation, bool bAltDown, bool bShiftDown, bool bCtrlDown) override;
113 ENGINE_API virtual void EditorApplyScale(const FVector& DeltaScale, const FVector* PivotLocation, bool bAltDown, bool bShiftDown, bool bCtrlDown) override;
114 ENGINE_API virtual void EditorApplyMirror(const FVector& MirrorScale, const FVector& PivotLocation) override;
115#endif // WITH_EDITOR
116 ENGINE_API virtual FBox GetComponentsBoundingBox(bool bNonColliding = false, bool bIncludeFromChildActors = false) const override;
117 ENGINE_API virtual void PostRegisterAllComponents() override;
118 ENGINE_API virtual void Tick(float DeltaSeconds) override;
119 virtual bool IsLevelBoundsRelevant() const override { return false; }
120 //~ End AActor Interface
121
123 ENGINE_API void PauseDitherTransition();
125 ENGINE_API void StartDitherTransition();
126
129
133
136
138 ENGINE_API void SetDrawDistance(float InDistance);
139
141 float GetDrawDistance() const { return LODDrawDistance; }
142 float GetLODDrawDistance() const { return LODDrawDistance; }
143 ENGINE_API float GetLODDrawDistanceWithOverride() const;
144
151 ENGINE_API void SetLODParent(UPrimitiveComponent* InLODParent, float InParentDrawDistance, bool bInApplyToImposters);
152
153#if WITH_EDITORONLY_DATA
159 void SetLODActorTag(const FString& InLODActorTag) { LODActorTag = InLODActorTag; }
160
166 const FString& GetLODActorTag() const { return LODActorTag; }
167#endif // WITH_EDITORONLY_DATA
168
170 const FName& GetKey() const { return Key; }
171
172#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) || WITH_EDITOR
177 ENGINE_API const bool IsBuilt(bool bInForce = false) const;
178#endif
179
181 ENGINE_API const bool HasValidLODChildren() const;
182
183#if WITH_EDITOR
186
192
198
204
209 ENGINE_API const bool HasValidSubActors() const;
210
215 ENGINE_API const bool HasAnySubActors() const;
216
219
221 ENGINE_API void SetForcedView(const bool InState);
222
225
228
231
234
235 // This will determine the shadowing flags for the static mesh component according to all sub actors
237
240
242 ENGINE_API void RecalculateDrawingDistance(const float TransitionScreenSize);
243
245 UHLODProxy* GetProxy() const { return Proxy; }
246
248 const UHLODProxyDesc* GetProxyDesc() const { return ProxyDesc; }
249
255
257 bool WasBuiltFromHLODDesc() const { return bBuiltFromHLODDesc; }
258#endif // WITH_EDITOR
259
260 //~ Begin UObject Interface.
261 ENGINE_API virtual FString GetDetailedInfoInternal() const override;
262 ENGINE_API virtual void PostLoad() override;
263 ENGINE_API virtual void Serialize(FArchive& Ar) override;
264#if WITH_EDITOR
265 ENGINE_API virtual bool Modify(bool bAlwaysMarkDirty = true) override;
267 ENGINE_API virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
268 ENGINE_API virtual void PreSave(FObjectPreSaveContext ObjectSaveContext) override;
269#endif // WITH_EDITOR
270
271
272
273 //~ End UObject Interface.
274public:
275#if WITH_EDITORONLY_DATA
277 UPROPERTY()
279
281 UPROPERTY()
283
285 UPROPERTY(EditAnywhere, Category = HierarchicalLODSettings)
287
290 FMaterialProxySettings MaterialSettings;
291
293 UPROPERTY(EditAnywhere, Category = HierarchicalLODSettings)
295
302 float TransitionScreenSize;
303
305 UPROPERTY(EditAnywhere, Category = HierarchicalLODSettings)
307
309 UPROPERTY(EditAnywhere, Category = HierarchicalLODSettings, meta = (editcondition = "bOverrideScreenSize"))
310 int32 ScreenSize;
311#endif // WITH_EDITORONLY_DATA
312
314 UStaticMeshComponent* GetStaticMeshComponent() const { return StaticMeshComponent; }
315
317 TArray<UInstancedStaticMeshComponent*> GetInstancedStaticMeshComponents() const { TArray<typename TDecay<decltype(InstancedStaticMeshComponents[FHLODInstancingKey()])>::Type> ISM; InstancedStaticMeshComponents.GenerateValueArray(ISM); return ISM; }
318
320 static ENGINE_API const TArray<float>& GetHLODDistanceOverride();
321
322private:
323 // Called when CVars are changed to check to see if the maximum HLOD level value has changed
324 static ENGINE_API void OnCVarsChanged();
325 static ENGINE_API void ParseOverrideDistancesCVar();
326 static ENGINE_API TArray<float> HLODDistances;
327
328 // Updates the transition distance according to values (if) set in r.HLOD.DistanceOverride
329 ENGINE_API void UpdateOverrideTransitionDistance();
330
331 // Called to make sure autoregistration/manual registration state matches based on the LOD override cvar and this actor's lod level
332 ENGINE_API void UpdateRegistrationToMatchMaximumLODLevel();
333
334 // Setup a LOD static mesh component.
335 ENGINE_API void SetupComponent(UStaticMeshComponent* InComponent);
336
337 // Utility methods to act on all static mesh components owned by this actor.
338 ENGINE_API void SetComponentsMinDrawDistance(float InMinDrawDistance, bool bInMarkRenderStateDirty);
339 ENGINE_API void RegisterMeshComponents();
340 ENGINE_API void UnregisterMeshComponents();
341
342 UFUNCTION()
343 ENGINE_API void OnSubActorEndPlay(AActor* Actor, EEndPlayReason::Type Reason);
344
345#if WITH_EDITOR
346 // Get/Create the LOD instanced static mesh component for a given imposter material.
349
350 // Get/Create the LOD static mesh component to use for a given actor.
351 ENGINE_API UStaticMeshComponent* GetLODComponentForActor(const AActor* InActor, bool bFallbackToDefault = true) const;
352 ENGINE_API UStaticMeshComponent* GetOrCreateLODComponentForActor(const AActor* InActor);
353
354public:
355 static ENGINE_API bool ShouldUseInstancing(const UStaticMeshComponent* InComponent);
356#endif
357
358private:
359 // Have we already tried to register components? (a cache to avoid having to query the owning world when the global HLOD max level setting is changed)
360 uint8 bHasActorTriedToRegisterComponents : 1;
361
362 // Flag whether or not the SubActors have been moved to a Parent LODActor
363 uint8 bHasPatchedUpParent : 1;
364
369 uint8 bRequiresLODScreenSizeConversion : 1;
370
372 uint8 bNeedsDrawDistanceReset : 1;
373
374#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) || WITH_EDITOR
376 mutable uint8 bCachedIsBuilt : 1;
377
379 mutable double LastIsBuiltTime;
380#endif
381
382 float ResetDrawDistanceTime;
383
384 // Sink for when CVars are changed to check to see if the maximum HLOD level value has changed
385 static ENGINE_API FAutoConsoleVariableSink CVarSink;
386
387#if WITH_EDITORONLY_DATA
388 UPROPERTY()
389 FString LODActorTag;
390
391 UPROPERTY()
393
396 TObjectPtr<UHLODProxyDesc> ProxyDesc;
397#endif // WITH_EDITORONLY_DATA
398};
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
ENGINE_API TAutoConsoleVariable< FString > CVarHLODDistanceOverride
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UFUNCTION(...)
Definition ObjectMacros.h:745
#define GENERATED_UCLASS_BODY(...)
Definition ObjectMacros.h:768
#define UCLASS(...)
Definition ObjectMacros.h:776
#define USTRUCT(...)
Definition ObjectMacros.h:746
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Actor.h:257
Definition LODActor.h:70
const FName & GetKey() const
Definition LODActor.h:170
ENGINE_API void ClearInstances()
TArray< UInstancedStaticMeshComponent * > GetInstancedStaticMeshComponents() const
Definition LODActor.h:317
float GetLODDrawDistance() const
Definition LODActor.h:142
ENGINE_API void AddInstances(const UStaticMesh *InStaticMesh, const UMaterialInterface *InMaterial, const TArray< FTransform > &InTransforms)
float GetDrawDistance() const
Definition LODActor.h:141
ENGINE_API void SetStaticMesh(UStaticMesh *InStaticMesh)
UStaticMeshComponent * GetStaticMeshComponent() const
Definition LODActor.h:314
virtual bool IsLevelBoundsRelevant() const override
Definition LODActor.h:119
ENGINE_API void AddInstances(const UStaticMesh *InStaticMesh, const UMaterialInterface *InMaterial, const TArray< FTransform > &InTransforms, const TArray< FCustomPrimitiveData > &InCustomPrimitiveData)
Definition Archive.h:1208
Definition IConsoleManager.h:1397
Definition NameTypes.h:617
Definition ObjectSaveContext.h:244
Definition UnrealType.h:174
Definition Array.h:670
Definition IConsoleManager.h:1792
Definition UnrealString.h.inl:34
Definition HLODProxyDesc.h:44
Definition HLODProxy.h:20
Definition InstancedStaticMeshComponent.h:158
Definition MaterialInterface.h:296
virtual FString GetDetailedInfoInternal() const
Definition Object.h:215
UE_FORCEINLINE_HINT bool Modify(bool bAlwaysMarkDirty=true)
Definition Object.h:317
Definition StaticMesh.h:593
Definition EngineTypes.h:3429
Definition LODActor.h:25
bool IsValid() const
Definition LODActor.h:49
friend uint32 GetTypeHash(const FHLODInstancingKey &Key)
Definition LODActor.h:54
FHLODInstancingKey(const UStaticMesh *InStaticMesh, const UMaterialInterface *InMaterial)
Definition LODActor.h:39
bool operator==(const FHLODInstancingKey &Other) const
Definition LODActor.h:44
Definition MaterialMerging.h:34
Definition UnrealType.h:6865
Definition Decay.h:44
Definition ObjectPtr.h:488