Agrarsense
Vehicle.h
Go to the documentation of this file.
1// Copyright (c) 2023 FrostBit Software Lab at the Lapland University of Applied Sciences
2//
3// This work is licensed under the terms of the MIT license.
4// For a copy, see <https://opensource.org/licenses/MIT>.
5
6#pragma once
7
8#include "CoreMinimal.h"
9#include "GameFramework/Pawn.h"
10#include "Engine/World.h"
11
20
21#include "Vehicle.generated.h"
22
23class UNiagaraComponent;
24class USensorsManagerComponent;
27class AOverlapSensor;
28
33DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FVehicleGarageChangedDelegate, bool, IsVehicleInGarage);
34
35/*
36* Base class for all vehicles.
37* Each vehicle automatically spawns Transform, Overlap and Collision sensors as well as
38* SensorsManagerComponent which manages all added sensors attached to the vehicle.
39*/
40UCLASS()
41class AGRARSENSE_API AVehicle : public APawn, public IInteractable, public IDestroyable, public IActorInformation
42{
43 GENERATED_BODY()
44
45public:
46
47 AVehicle();
48
53 UFUNCTION(BlueprintCallable)
54 virtual EVehicleTypes GetVehicleType() const
55 {
57 }
58
63 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
64 void TogglePhysics(bool isOn);
65
71 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
72 void SetVehicleMeshVisibility(bool Visible);
73
79 UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
80 void TeleportVehicleTo(FVector NewLocation, FRotator NewRotation);
81
87 virtual void TeleportVehicleTo_Implementation(FVector NewLocation, FRotator NewRotation);
88
92 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
93 void ResetCamera();
94
99 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
100 void ToggleLights(bool isOn);
101
106 UFUNCTION(BlueprintCallable)
107 void SetVisualizeVehicleOverlapArea(bool Visible);
108
114 UFUNCTION(BlueprintCallable)
115 FString ExportToJsonFile(const FString& FileName);
116
121 UFUNCTION(BlueprintCallable)
122 void SetVehicleIsInGarage(bool VehicleIsInGarage)
123 {
124 VehicleInGarage = VehicleIsInGarage;
125 OnVehicleGarageChanged.Broadcast(VehicleInGarage);
126 }
127
132 UFUNCTION(BlueprintPure)
133 bool IsVehicleInGarage() const
134 {
135 return VehicleInGarage;
136 }
137
142 UFUNCTION(BlueprintCallable)
143 USensorsManagerComponent* GetSensorsManager() const
144 {
145 return SensorsManager;
146 }
147
152 UFUNCTION(BlueprintPure)
153 ACollisionSensor* GetCollisionSensor() const
154 {
155 return CollisionSensor;
156 }
157
162 UFUNCTION(BlueprintPure)
163 ATransformSensor* GetTransformSensor() const
164 {
165 return TransformSensor;
166 }
167
172 UFUNCTION(BlueprintPure)
173 AOverlapSensor* GetOverlapSensor() const
174 {
175 return OverlapSensor;
176 }
177
182 UFUNCTION(BlueprintPure)
183 FTransform GetMovedFromGarageTransform() const
184 {
185 return MovedFromGarageTransform;
186 }
187
188 UFUNCTION(BlueprintCallable)
189 virtual void SetCurrentTransformToMovedFromGarageTransform()
190 {
191 MovedFromGarageTransform = GetTransform();
192 }
193
194 virtual FText GetInteractableName_Implementation() const override
195 {
196 return InteractableName;
197 }
198
199 virtual FTransform GetInteractableWorldTransform_Implementation() const override
200 {
201 return GetActorTransform();
202 }
203
204 virtual FString GetActorID_Implementation() const override
205 {
206 return ActorID;
207 }
208
209 virtual FString GetActorName_Implementation() const override
210 {
211 return ActorName;
212 }
213
214 virtual FString GetActorInformation_Implementation() const override
215 {
216 const FString Vehicle = UEnumUtilities::ConvertVehicleTypeToString(GetVehicleType());
217 const FString ID = IActorInformation::Execute_GetActorID(this);
218 const FString Name = IActorInformation::Execute_GetActorName(this);
219 const FTransform VehicleTransform = GetActorTransform();
220 const FVector Location = VehicleTransform.GetLocation();
221 const FRotator Rotation = VehicleTransform.Rotator();
222 FString Information = FString::Printf(TEXT("Vehicle: %s, Name: %s, ID: %s, Location: %s, Rotation: %s"), *Vehicle, *Name, *ID, *Location.ToString(), *Rotation.ToString());
223
224 return Information;
225 }
226
227 virtual void SetActorName_Implementation(const FString& NewActorName) override
228 {
229 ActorName = NewActorName;
230 }
231
232 virtual void SetActorIDAndName_Implementation(const FString& NewActorName, const FString& NewID) override
233 {
234 ActorName = NewActorName;
235 ActorID = NewID;
236 SetAndValidateActorIDAndName(ActorName, ActorID, TWeakObjectPtr<AActor>(this));
237 }
238
239 /*
240 * Set wheeled vehicle parameters. Does nothing for done.
241 */
242 UFUNCTION(BlueprintCallable)
243 void SetVehicleParameters(FWheeledVehicleParameters NewParameters);
244
245 /*
246 * get current wheeled vehicle parameters.
247 */
248 UFUNCTION(BlueprintPure)
249 FWheeledVehicleParameters GetVehicleParameters() const
250 {
251 return VehicleParameters;
252 }
253
254 /*
255 * Apply wheeled vehicle parameters (Blueprint side)
256 */
257 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
258 void ApplyVehicleParameters(FWheeledVehicleParameters CurrentParameters);
259
260 virtual void PossessedBy(AController* NewController) override;
261
262 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Interactable")
263 FText InteractableName;
264
265 UPROPERTY(BlueprintAssignable)
266 FVehicleGarageChangedDelegate OnVehicleGarageChanged;
267
268protected:
269
270 virtual void BeginPlay() override;
271
272 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
273
274 UFUNCTION()
275 virtual void ROSBridgeStateChanged(EROSState ROSState);
276
277 /*
278 * Wheeled vehicle parameters. Does nothing for drone.
279 */
280 UPROPERTY(Category = Vehicle, VisibleAnywhere, BlueprintReadWrite)
281 FWheeledVehicleParameters VehicleParameters;
282
283 /*
284 * Manages sensors attached to this vehicle
285 */
286 UPROPERTY(Category = Vehicle, VisibleAnywhere, BlueprintReadOnly)
287 TObjectPtr<USensorsManagerComponent> SensorsManager;
288
289 UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
290 ACollisionSensor* CollisionSensor = nullptr;
291
292 UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
293 ATransformSensor* TransformSensor = nullptr;
294
295 UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
296 AOverlapSensor* OverlapSensor = nullptr;
297
298 UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
299 UNiagaraComponent* NiagaraComponent = nullptr;
300
301 // Extra transform sensor positions for vehicle
302 // Added in BP_Forwarder and BP_Harvester BeginPlay.
303 UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
304 TArray<UStaticMeshComponent*> ExtraTransformSensorPositions;
305
306 UPROPERTY(VisibleAnywhere)
307 FString ActorName;
308
309 UPROPERTY(VisibleAnywhere)
310 FString ActorID;
311
312 UPROPERTY(EditAnywhere, BlueprintReadWrite)
313 FTransform OriginalCameraTransform;
314
315 FTransform MovedFromGarageTransform;
316
317 bool VehicleInGarage = false;
318
319 TArray<ATransformSensor*> ExtraTransformSensors;
320};
EROSState
Definition: ROSState.h:16
EVehicleTypes
Definition: VehicleTypes.h:15
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FVehicleGarageChangedDelegate, bool, IsVehicleInGarage)
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
virtual void BeginPlay() override
AVehicle * Vehicle
void ROSBridgeStateChanged(EROSState ROSState)
Definition: Sensor.cpp:169
FString ExportToJsonFile(const FString &FileName)
Definition: Sensor.cpp:154
virtual FText GetInteractableName_Implementation() const override
Definition: Vehicle.h:194
virtual FString GetActorID_Implementation() const override
Definition: Vehicle.h:204
virtual void SetActorIDAndName_Implementation(const FString &NewActorName, const FString &NewID) override
Definition: Vehicle.h:232
virtual FString GetActorInformation_Implementation() const override
Definition: Vehicle.h:214
virtual FString GetActorName_Implementation() const override
Definition: Vehicle.h:209
virtual FTransform GetInteractableWorldTransform_Implementation() const override
Definition: Vehicle.h:199
virtual void SetActorName_Implementation(const FString &NewActorName) override
Definition: Vehicle.h:227
static void SetAndValidateActorIDAndName(FString &ActorName, FString &ActorID, TWeakObjectPtr< AActor > Actor)
static FString ConvertVehicleTypeToString(EVehicleTypes VehicleType)