CARLA
 
载入中...
搜索中...
未找到
CarlaLightSubsystem.cpp
浏览该文件的文档.
1// Copyright (c) 2020 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#include "CarlaLightSubsystem.h"//这里的“CarlaLightSubsystem.h”是一个头文件。这个头文件可能包含了与“CarlaLightSubsystem”相关的类定义、函数声明等内容。
8#include "Carla/Weather/Weather.h"//同样是“#include”预处理指令。“Carla/Weather/Weather.h”是一个头文件,按照这个路径结构,它可能是属于“Carla”项目中与天气(Weather)相关的头文件。这个头文件可能包含了与天气相关的类、结构体或者函数的定义和声明,比如天气状态的定义、获取天气信息的函数声明等内容。
9#include "Kismet/GameplayStatics.h"//“Kismet/GameplayStatics.h”头文件可能包含了与游戏玩法相关的静态函数等内容。
10
11//using cr = carla::rpc;
12
13void UCarlaLightSubsystem::Initialize(FSubsystemCollectionBase& Collection)
14{
15 // TODO: 订阅地图变化
16}
17
18// UCarlaLightSubsystem类的成员函数,用于反初始化
20{
21 // 这个函数目前为空,不执行任何操作
22}
23
24// UCarlaLightSubsystem类的成员函数,用于注册一个灯光组件
25void UCarlaLightSubsystem::RegisterLight(UCarlaLight* CarlaLight)
26{
27 // 检查传入的灯光组件是否有效
28 if(CarlaLight)
29 {
30 // 获取灯光的ID
31 auto LightId = CarlaLight->GetId();
32 // 检查是否已经存在具有相同ID的灯光
33 if (Lights.Contains(LightId))
34 {
35 // 如果存在,记录警告日志并返回
36 UE_LOG(LogCarla, Warning, TEXT("Light Id overlapping"));
37 return;
38 }
39 // 将灯光添加到集合中
40 Lights.Add(LightId, CarlaLight);
41 }
42 // 设置客户端状态为脏,表示需要更新
44}
45
46// UCarlaLightSubsystem类的成员函数,用于注销一个灯光组件
47void UCarlaLightSubsystem::UnregisterLight(UCarlaLight* CarlaLight)
48{
49 // 检查传入的灯光组件是否有效
50 if(CarlaLight)
51 {
52 // 从集合中移除灯光
53 Lights.Remove(CarlaLight->GetId());
54 }
55 // 设置客户端状态为脏,表示需要更新
57}
58
59// UCarlaLightSubsystem类的成员函数,用于检查是否有待更新的灯光
61{
62 // 遍历客户端状态集合
63 for (auto ClientPair : ClientStates)
64 {
65 // 如果有任何客户端状态为真,表示有更新待处理
66 if(ClientPair.Value)
67 {
68 return true;
69 }
70 }
71 // 如果所有客户端状态都为假,表示没有更新待处理
72 return false;
73}
74
75// UCarlaLightSubsystem类的成员函数,用于获取所有灯光的状态
76std::vector<carla::rpc::LightState> UCarlaLightSubsystem::GetLights(FString Client)
77{
78 // 创建一个用于存储结果的向量
79 std::vector<carla::rpc::LightState> result;
80
81 // 为指定客户端设置状态为false
82 ClientStates.FindOrAdd(Client) = false;
83
84 // 遍历所有灯光
85 for(auto& Light : Lights)
86 {
87 // 获取灯光组件
88 UCarlaLight* CarlaLight = Light.Value;
89
90 // 将灯光的状态添加到结果向量中
91 result.push_back(CarlaLight->GetLightState());
92 }
93 return result;
94}
95
96// UCarlaLightSubsystem类的成员函数,用于设置灯光状态
98 FString Client,
99 std::vector<carla::rpc::LightState> LightsToSet,
100 bool DiscardClient)
101{
102 // 查找指定客户端的状态
103 bool* ClientState = ClientStates.Find(Client);
104
105 // 如果找到客户端状态
106 if(ClientState) {
107 // 遍历所有需要设置的灯光状态
108 for(auto& LightState : LightsToSet) {
109 // 查找对应的灯光组件
110 UCarlaLight* CarlaLight = Lights.FindRef(LightState._id);
111 // 如果找到灯光组件,设置其状态
112 if(CarlaLight) {
113 CarlaLight->SetLightState(LightState);
114 }
115 }
116 // 更新客户端状态为已更新
117 *ClientState = true;
118
119 // 如果需要丢弃客户端状态
120 if(DiscardClient)
121 {
122 // 从客户端状态集合中移除指定客户端
123 ClientStates.Remove(Client);
124 }
125 }
126
127}
128
129// UCarlaLightSubsystem类的成员函数,用于根据ID获取灯光组件
131{
132 // 检查集合中是否包含指定ID的灯光
133 if (Lights.Contains(Id))
134 {
135 // 如果包含,返回对应的灯光组件
136 return Lights[Id];
137 }
138 // 如果不包含,返回nullptr
139 return nullptr;
140}
141
142// UCarlaLightSubsystem类的成员函数,用于设置日夜循环是否激活
144 // 获取所有天气控制器
145 TArray<AActor*> WeatherActors;
146 UGameplayStatics::GetAllActorsOfClass(GetWorld(), AWeather::StaticClass(), WeatherActors);
147 // 如果存在天气控制器
148 if (WeatherActors.Num())
149 {
150 // 获取第一个天气控制器
151 if (AWeather* WeatherActor = Cast<AWeather>(WeatherActors[0]))
152 {
153 // 设置日夜循环状态
154 WeatherActor->SetDayNightCycle(active);
155 }
156 }
157}
158
159// UCarlaLightSubsystem类的成员函数,用于标记客户端状态为脏
160void UCarlaLightSubsystem::SetClientStatesdirty(FString ClientThatUpdate)
161{
162 for(auto& Client : ClientStates)
163 {
164 // 如果当前客户端不是更新的客户端
165 if(Client.Key != ClientThatUpdate)
166 {
167 Client.Value = true;
168 }
169
170 }
171}
FVehicleLightState LightState
Definition ActorData.h:131
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
void SetClientStatesdirty(FString ClientThatUpdate)
void Initialize(FSubsystemCollectionBase &Collection) override
TMap< int, UCarlaLight * > Lights
TMap< int, UCarlaLight * > & GetLights()
TMap< FString, bool > ClientStates
void SetLights(FString Client, std::vector< carla::rpc::LightState > LightsToSet, bool DiscardClient=false)
void RegisterLight(UCarlaLight *CarlaLight)
void UnregisterLight(UCarlaLight *CarlaLight)
void SetDayNightCycle(const bool active)
UCarlaLight * GetLight(int Id)