CARLA
 
载入中...
搜索中...
未找到
VegetationManager.h
浏览该文件的文档.
1// Copyright (c) 2022 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
9// 引入相关头文件,这些头文件包含了游戏框架、组件、材质以及 Carla 相关模块等的定义
10#include "GameFramework/Actor.h"
11#include "ProceduralFoliageVolume.h"
12#include "Components/InstancedStaticMeshComponent.h"
13#include "Materials/MaterialInstanceDynamic.h"
14#include "InstancedFoliageActor.h"
15
16#include "Containers/Array.h"
17#include "Containers/Map.h"
18
21#include <memory>
22
23#include "VegetationManager.generated.h"
24
25// 定义结构体 FTileMeshComponent,用于存储与瓦片相关的实例化静态网格组件信息及使用索引等
26USTRUCT()
28{
29 GENERATED_BODY()
30 // 指向实例化静态网格组件的指针,初始化为空
31 UInstancedStaticMeshComponent* InstancedStaticMeshComponent {nullptr};
32 // 记录正在使用的索引数组
33 TArray<int32> IndicesInUse {};
34 // 表示该瓦片相关组件是否处于活动(存活)状态
35 bool bIsAlive = false;
36};
37
38// 定义结构体 FTileData,用于存储与瓦片相关的各种数据,如实例化植被 actor、过程化植被体积等
39USTRUCT()
41{
42 GENERATED_BODY()
43 // 指向实例化植被 actor 的指针
44 AInstancedFoliageActor* InstancedFoliageActor {nullptr};
45 // 指向过程化植被体积的指针
46 AProceduralFoliageVolume* ProceduralFoliageVolume {nullptr};
47 // 缓存瓦片的网格组件信息
48 TArray<std::shared_ptr<FTileMeshComponent>> TileMeshesCache {};
49 // 缓存动态材质实例的数组
50 TArray<UMaterialInstanceDynamic*> MaterialInstanceDynamicCache {};
51
52 // 判断是否包含指定的实例化静态网格组件
53 bool ContainsMesh(const UInstancedStaticMeshComponent*) const;
54 // 更新瓦片的网格组件信息
55 void UpdateTileMeshComponent(UInstancedStaticMeshComponent* NewInstancedStaticMeshComponent);
56 // 根据给定值和调试材质标志更新材质缓存
57 void UpdateMaterialCache(const FLinearColor& Value, bool DebugMaterials);
58 // 析构函数
59 ~FTileData();
60};
61
62// 定义结构体 FFoliageBlueprint,用于处理植被蓝图相关信息,如蓝图类名和生成的 actor 类等
63USTRUCT()
65{
66 GENERATED_BODY()
67 // 完整的蓝图类名(字符串形式)
68 FString BPFullClassName {};
69 // 实际生成的 actor 类(类型为 TSubclassOf<AActor>)
70 TSubclassOf<AActor> SpawnedClass { nullptr };
71
72 // 判断当前蓝图是否有效
73 bool IsValid() const;
74 // 根据给定路径设置蓝图类名
75 bool SetBPClassName(const FString& Path);
76 // 设置生成的 actor 类
77 bool SetSpawnedClass();
78};
79
80// 定义结构体 FPooledActor,用于管理池化的 actor,包含 actor 的使用状态、激活状态、指针等信息
81USTRUCT()
83{
84 GENERATED_BODY()
85 // 表示该 actor 是否正在被使用
86 bool InUse { false };
87 // 表示该 actor 是否处于激活状态
88 bool IsActive { false };
89 // 指向实际的 actor 实例的指针
90 AActor* Actor { nullptr };
91 // 该 actor 的全局变换信息
92 FTransform GlobalTransform {FTransform()};
93 // 索引值
94 int32 Index {-1};
95 // 指向与之关联的瓦片网格组件的智能指针
96 std::shared_ptr<FTileMeshComponent> TileMeshComponent {nullptr};
97
98 // 启用 actor,设置其变换、索引以及关联的瓦片网格组件
99 void EnableActor(
100 const FTransform& Transform,
101 int32 NewIndex,
102 std::shared_ptr<FTileMeshComponent>& NewTileMeshComponent);
103 // 将 actor 设置为激活状态
104 void ActiveActor();
105 // 禁用 actor
106 void DisableActor();
107};
108
109// 定义结构体 FElementsToSpawn,用于存储要生成的元素相关信息,包括瓦片网格组件、植被蓝图以及位置和索引信息
110USTRUCT()
112{
113 GENERATED_BODY()
114 // 要生成元素对应的瓦片网格组件
115 std::shared_ptr<FTileMeshComponent> TileMeshComponent;
116 // 植被蓝图相关信息
118 // 包含变换和索引的配对数组,表示生成元素的位置和对应索引
119 TArray<TPair<FTransform, int32>> TransformIndex;
120};
121
122// 定义 AVegetationManager 类,继承自 AActor,用于管理植被相关的各种操作,如添加车辆、更新资源池位置等
123UCLASS()
124class CARLA_API AVegetationManager : public AActor
125{
126 GENERATED_BODY()
127
128public:
129 // 向管理器中添加车辆(Carla 轮式车辆类型)
130 void AddVehicle(ACarlaWheeledVehicle* Vehicle);
131 // 从管理器中移除车辆(Carla 轮式车辆类型)
132 void RemoveVehicle(ACarlaWheeledVehicle* Vehicle);
133
134 // 蓝图可调用函数,用于更新资源池的基础位置
135 UFUNCTION(BlueprintCallable)
136 void UpdatePoolBasePosition();
137
138public:
139 // 是否开启调试材质的属性,可在编辑器中编辑默认值
140 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
141 bool DebugMaterials {false};
142
143 // 隐藏材质的距离属性,可在编辑器中编辑默认值,控制多远的距离开始隐藏材质相关表现
144 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
145 float HideMaterialDistance {500.0f};
146
147 // 激活 actor 的距离属性,可在编辑器中编辑默认值,控制多远的距离激活 actor
148 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
149 float ActiveActorDistance {500.0f};
150
151 // 用于调试的过滤器,控制是否生成灌木丛,可在编辑器中编辑默认值
152 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
153 bool SpawnBushes {true};
154
155 // 用于调试的过滤器,控制是否生成树木,可在编辑器中编辑默认值
156 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
157 bool SpawnTrees {true};
158
159 // 用于调试的过滤器,控制是否生成岩石,可在编辑器中编辑默认值
160 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
161 bool SpawnRocks {true};
162
163 // 用于调试的过滤器,控制是否生成植物,可在编辑器中编辑默认值
164 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
165 bool SpawnPlants {true};
166
167 // 生成的缩放比例属性,可在编辑器中编辑默认值,影响植被生成的缩放效果
168 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
169 float SpawnScale {1.0f};
170
171 // 初始资源池大小属性,可在编辑器中编辑默认值,决定初始创建的资源池中的 actor 数量
172 UPROPERTY(Category = "CARLA Vegetation Spawner", EditDefaultsOnly)
173 int32 InitialPoolSize {10};
174
175 /// @}
176 // ===========================================================================
177 /// @name Overriden from AActor
178 // ===========================================================================
179 /// @{
180protected:
181 // 重写 AActor 的 BeginPlay 函数,游戏开始时执行相关初始化等操作
182 virtual void BeginPlay() override;
183 // 重写 AActor 的 Tick 函数,每帧执行相关更新逻辑
184 virtual void Tick(float DeltaTime) override;
185
186private:
187 // 根据给定的路径(字符串形式)判断对应的植被类型是否启用
188 bool IsFoliageTypeEnabled(const FString& Path) const;
189 // 检查是否有新的瓦片,用于相关更新逻辑判断
190 bool CheckForNewTiles() const;
191
192 // 获取正在使用的瓦片名称数组
193 TArray<FString> GetTilesInUse();
194
195 // 更新给定瓦片的材质信息
196 void UpdateMaterials(FTileData* Tile);
197 // 获取给定瓦片要生成的元素信息数组
198 TArray<FElementsToSpawn> GetElementsToSpawn(FTileData* Tile);
199 // 根据要生成的元素信息生成骨骼植被(具体实现可能涉及复杂的植被生成逻辑)
200 void SpawnSkeletalFoliages(TArray<FElementsToSpawn>& ElementsToSpawn);
201 // 销毁骨骼植被(可能涉及释放相关资源等操作)
202 void DestroySkeletalFoliages();
203 // 激活资源池中的 actor(根据相关距离等条件判断激活哪些 actor)
204 void ActivePooledActors();
205 // 从资源池中启用指定的 actor,根据给定的变换、索引、瓦片网格组件以及资源池等信息进行操作
206 bool EnableActorFromPool(
207 const FTransform& Transform,
208 int32 Index,
209 std::shared_ptr<FTileMeshComponent>& TileMeshComponent,
210 TArray<FPooledActor>& Pool);
211
212 // 创建或更新瓦片缓存(可能涉及加载、更新瓦片相关数据等操作)
213 void CreateOrUpdateTileCache(ULevel* InLevel);
214 // 更新植被蓝图缓存(可能涉及重新加载、验证蓝图相关信息等操作)
215 void UpdateFoliageBlueprintCache(ULevel* InLevel);
216 // 设置瓦片数据内部相关信息(具体设置内容可能由函数内部逻辑决定)
217 void SetTileDataInternals(FTileData& TileData);
218 // 设置实例化静态网格组件缓存(可能涉及初始化、更新组件相关缓存数据等操作)
219 void SetInstancedStaticMeshComponentCache(FTileData& TileData);
220 // 设置材质缓存(根据具体逻辑更新材质相关的缓存信息)
221 void SetMaterialCache(FTileData& TileData);
222
223 // 释放瓦片缓存相关资源(可能涉及删除缓存数据、释放内存等操作)
224 void FreeTileCache(ULevel* InLevel);
225
226 // 当关卡添加到世界时调用的函数,执行相关初始化等操作
227 void OnLevelAddedToWorld(ULevel* InLevel, UWorld* InWorld);
228 // 当关卡从世界移除时调用的函数,执行相关清理等操作
229 void OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld);
230 // 世界原点偏移后调用的函数,进行相关数据更新等操作(例如更新植被位置等)
231 void PostWorldOriginOffset(UWorld*, FIntVector, FIntVector InDstOrigin);
232
233 // 为给定的植被蓝图类创建对应的资源池
234 void CreatePoolForBPClass(const FFoliageBlueprint& BP);
235 // 根据给定的植被蓝图和变换信息创建植被 actor(具体创建逻辑根据植被类型等因素而定)
236 AActor* CreateFoliage(const FFoliageBlueprint& BP, const FTransform& Transform) const;
237
238 // 获取骨骼模板(具体获取逻辑和用途可能与植被的骨骼相关特性有关)
240
241private:
242 // 用于资源池平移的定时器,控制资源池位置更新的时间间隔
243 float PoolTranslationTimer {30.0f};
244 // 资源池非激活状态下的变换信息,初始化为默认值
245 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)};
246 // 指向大型地图管理器的指针
247 ALargeMapManager* LargeMap {nullptr};
248 // 指向主角车辆(Carla 轮式车辆类型)的指针
249 ACarlaWheeledVehicle* HeroVehicle {nullptr};
250 // 缓存植被蓝图信息的映射表,键为字符串(可能是蓝图相关标识),值为 FFoliageBlueprint 结构体
251 TMap<FString, FFoliageBlueprint> FoliageBlueprintCache {};
252 // 缓存瓦片数据的映射表,键为字符串(可能是瓦片相关标识),值为 FTileData 结构体
253 TMap<FString, FTileData> TileCache {};
254 // 缓存 actor 资源池的映射表,键为字符串(可能是与 actor 类型相关标识),值为 FPooledActor 数组
255 TMap<FString, TArray<FPooledActor>> ActorPool {};
256
257 // 用于更新资源池非激活变换的定时器句柄
259};
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
Base class for CARLA wheeled vehicles.
FTimerHandle UpdatePoolInactiveTransformTimer