CARLA
Loading...
Searching...
No Matches
VegetationManager.h
Go to the documentation of this file.
1// Copyright (c) 2026 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8
11
12#include <util/ue-header-guard-begin.h>
13#include "ProceduralFoliageVolume.h"
14#include "GameFramework/Actor.h"
15#include "Containers/Array.h"
16#include "Containers/Map.h"
17#include "Components/InstancedStaticMeshComponent.h"
18#include "Materials/MaterialInstanceDynamic.h"
19#include "InstancedFoliageActor.h"
20#include <util/ue-header-guard-end.h>
21
22#include <memory>
23
24#include "VegetationManager.generated.h"
25
26USTRUCT()
28{
29 GENERATED_BODY()
30 UInstancedStaticMeshComponent* InstancedStaticMeshComponent {nullptr};
31 TArray<int32> IndicesInUse {};
32 bool bIsAlive = false;
33};
34
35USTRUCT()
37{
38 GENERATED_BODY()
39 AInstancedFoliageActor* InstancedFoliageActor {nullptr};
40 AProceduralFoliageVolume* ProceduralFoliageVolume {nullptr};
41 TArray<std::shared_ptr<FTileMeshComponent>> TileMeshesCache {};
42 TArray<UMaterialInstanceDynamic*> MaterialInstanceDynamicCache {};
43
44 bool ContainsMesh(const UInstancedStaticMeshComponent*) const;
45 void UpdateTileMeshComponent(UInstancedStaticMeshComponent* NewInstancedStaticMeshComponent);
46 void UpdateMaterialCache(const FLinearColor& Value, bool DebugMaterials);
47 ~FTileData();
48};
49
50USTRUCT()
52{
53 GENERATED_BODY()
54
55 UPROPERTY()
56 FString BPFullClassName {};
57
58 UPROPERTY()
59 TSubclassOf<AActor> SpawnedClass { nullptr };
60
61 bool IsValid() const;
62 bool SetBPClassName(const FString& Path);
63 bool SetSpawnedClass();
64};
65
66USTRUCT()
68{
69 GENERATED_BODY()
70 bool InUse { false };
71 bool IsActive { false };
72 AActor* Actor { nullptr };
73 FTransform GlobalTransform {FTransform()};
74 int32 Index {-1};
75 std::shared_ptr<FTileMeshComponent> TileMeshComponent {nullptr};
76
77 void EnableActor(
78 const FTransform& Transform,
79 int32 NewIndex,
80 std::shared_ptr<FTileMeshComponent>& NewTileMeshComponent);
81 void ActiveActor();
82 void DisableActor();
83};
84
85USTRUCT()
87{
88 GENERATED_BODY()
89 std::shared_ptr<FTileMeshComponent> TileMeshComponent;
91 TArray<TPair<FTransform, int32>> TransformIndex;
92};
93
94UCLASS()
95class CARLA_API AVegetationManager : public AActor
96{
97 GENERATED_BODY()
98
99public:
100 void AddVehicle(ACarlaWheeledVehicle* Vehicle);
101 void RemoveVehicle(ACarlaWheeledVehicle* Vehicle);
102
103 UFUNCTION(BlueprintCallable)
104 void UpdatePoolBasePosition();
105
106public:
107 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
108 bool DebugMaterials {false};
109
110 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
111 float HideMaterialDistance {500.0f};
112
113 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
114 float ActiveActorDistance {500.0f};
115
116 //Filters for debug
117 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
118 bool SpawnBushes {true};
119
120 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
121 bool SpawnTrees {true};
122
123 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
124 bool SpawnRocks {true};
125
126 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
127 bool SpawnPlants {true};
128
129 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
130 float SpawnScale {1.0f};
131
132 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
133 int32 InitialPoolSize {10};
134
135 /// @}
136 // ===========================================================================
137 /// @name Overriden from AActor
138 // ===========================================================================
139 /// @{
140protected:
141 virtual void BeginPlay() override;
142 virtual void Tick(float DeltaTime) override;
143
144private:
145 bool IsFoliageTypeEnabled(const FString& Path) const;
146 bool CheckForNewTiles() const;
147
148 TArray<FString> GetTilesInUse();
149
150 void UpdateMaterials(FTileData* Tile);
151 TArray<FElementsToSpawn> GetElementsToSpawn(FTileData* Tile);
152 void SpawnSkeletalFoliages(TArray<FElementsToSpawn>& ElementsToSpawn);
153 void DestroySkeletalFoliages();
154 void ActivePooledActors();
155 bool EnableActorFromPool(
156 const FTransform& Transform,
157 int32 Index,
158 std::shared_ptr<FTileMeshComponent>& TileMeshComponent,
159 TArray<FPooledActor>& Pool);
160
161 void CreateOrUpdateTileCache(ULevel* InLevel);
162 void UpdateFoliageBlueprintCache(ULevel* InLevel);
163 void SetTileDataInternals(FTileData& TileData);
164 void SetInstancedStaticMeshComponentCache(FTileData& TileData);
165 void SetMaterialCache(FTileData& TileData);
166
167 void FreeTileCache(ULevel* InLevel);
168
169 void OnLevelAddedToWorld(ULevel* InLevel, UWorld* InWorld);
170 void OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld);
171 void PostWorldOriginOffset(UWorld*, FIntVector, FIntVector InDstOrigin);
172
173 void CreatePoolForBPClass(const FFoliageBlueprint& BP);
174 AActor* CreateFoliage(const FFoliageBlueprint& BP, const FTransform& Transform) const;
175
177
178private:
179 float PoolTranslationTimer {30.0f};
180 FTransform InactivePoolTransform { FQuat(1.0f, 1.0f, 1.0f, 1.0f), FVector(1.0f, 1.0f, 1.0f), FVector(1.0f, 1.0f, 1.0f)};
181 //Actors
182 ALargeMapManager* LargeMap {nullptr};
183 ACarlaWheeledVehicle* HeroVehicle {nullptr};
184 //Caches
185 TMap<FString, FFoliageBlueprint> FoliageBlueprintCache {};
186 TMap<FString, FTileData> TileCache {};
187 //Pools
188 TMap<FString, TArray<FPooledActor>> ActorPool {};
189
191};
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
Base class for CARLA wheeled vehicles.
FTimerHandle UpdatePoolInactiveTransformTimer