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*/
38UCLASS()
39class AGRARSENSE_API AVehicle : public APawn, public IInteractable, public IDestroyable, public IActorInformation
40{
41 GENERATED_BODY()
42
43public:
44
45 AVehicle();
46
51 UFUNCTION(BlueprintCallable)
52 virtual EVehicleTypes GetVehicleType() const
53 {
55 }
56
61 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
62 void TogglePhysics(bool isOn);
63
69 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
70 void SetVehicleMeshVisibility(bool Visible);
71
77 UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
78 void TeleportVehicleTo(FVector NewLocation, FRotator NewRotation);
79
85 virtual void TeleportVehicleTo_Implementation(FVector NewLocation, FRotator NewRotation);
86
90 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
91 void ResetCamera();
92
97 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
98 void ToggleLights(bool isOn);
99
104 UFUNCTION(BlueprintCallable)
105 void SetVisualizeVehicleOverlapArea(bool Visible);
106
112 UFUNCTION(BlueprintCallable)
113 FString ExportToJsonFile(const FString& FileName);
114
119 UFUNCTION(BlueprintCallable)
120 void SetVehicleIsInGarage(bool VehicleIsInGarage)
121 {
122 VehicleInGarage = VehicleIsInGarage;
123 OnVehicleGarageChanged.Broadcast(VehicleInGarage);
124 }
125
130 UFUNCTION(BlueprintPure)
131 bool IsVehicleInGarage() const
132 {
133 return VehicleInGarage;
134 }
135
140 UFUNCTION(BlueprintCallable)
141 USensorsManagerComponent* GetSensorsManager() const
142 {
143 return SensorsManager;
144 }
145
150 UFUNCTION(BlueprintPure)
151 ACollisionSensor* GetCollisionSensor() const
152 {
153 return CollisionSensor;
154 }
155
160 UFUNCTION(BlueprintPure)
161 ATransformSensor* GetTransformSensor() const
162 {
163 return TransformSensor;
164 }
165
170 UFUNCTION(BlueprintPure)
171 AOverlapSensor* GetOverlapSensor() const
172 {
173 return OverlapSensor;
174 }
175
180 UFUNCTION(BlueprintPure)
181 FTransform GetMovedFromGarageTransform() const
182 {
183 return MovedFromGarageTransform;
184 }
185
186 UFUNCTION(BlueprintCallable)
187 virtual void SetCurrentTransformToMovedFromGarageTransform()
188 {
189 MovedFromGarageTransform = GetTransform();
190 }
191
192 virtual FText GetInteractableName_Implementation() const override
193 {
194 return InteractableName;
195 }
196
197 virtual FTransform GetInteractableWorldTransform_Implementation() const override
198 {
199 return GetActorTransform();
200 }
201
202 virtual FString GetActorID_Implementation() const override
203 {
204 return ActorID;
205 }
206
207 virtual FString GetActorName_Implementation() const override
208 {
209 return ActorName;
210 }
211
212 virtual FString GetActorInformation_Implementation() const override
213 {
214 const FString Vehicle = UEnumUtilities::ConvertVehicleTypeToString(GetVehicleType());
215 const FString ID = IActorInformation::Execute_GetActorID(this);
216 const FString Name = IActorInformation::Execute_GetActorName(this);
217 const FTransform VehicleTransform = GetActorTransform();
218 const FVector Location = VehicleTransform.GetLocation();
219 const FRotator Rotation = VehicleTransform.Rotator();
220 FString Information = FString::Printf(TEXT("Vehicle: %s, Name: %s, ID: %s, Location: %s, Rotation: %s"), *Vehicle, *Name, *ID, *Location.ToString(), *Rotation.ToString());
221
222 return Information;
223 }
224
225 virtual void SetActorName_Implementation(const FString& NewActorName) override
226 {
227 ActorName = NewActorName;
228 }
229
230 virtual void SetActorIDAndName_Implementation(const FString& NewActorName, const FString& NewID) override
231 {
232 ActorName = NewActorName;
233 ActorID = NewID;
234 SetAndValidateActorIDAndName(ActorName, ActorID, TWeakObjectPtr<AActor>(this));
235 }
236
237 /*
238 * Set wheeled vehicle parameters. Does nothing for done.
239 */
240 UFUNCTION(BlueprintCallable)
241 void SetVehicleParameters(FWheeledVehicleParameters NewParameters);
242
243 /*
244 * get current wheeled vehicle parameters.
245 */
246 UFUNCTION(BlueprintPure)
247 FWheeledVehicleParameters GetVehicleParameters() const
248 {
249 return VehicleParameters;
250 }
251
252 /*
253 * Apply wheeled vehicle parameters (Blueprint side)
254 */
255 UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
256 void ApplyVehicleParameters(FWheeledVehicleParameters CurrentParameters);
257
258 virtual void PossessedBy(AController* NewController) override;
259
260 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Interactable")
261 FText InteractableName;
262
263 UPROPERTY(BlueprintAssignable)
264 FVehicleGarageChangedDelegate OnVehicleGarageChanged;
265
266protected:
267
268 virtual void BeginPlay() override;
269
270 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
271
272 UFUNCTION()
273 virtual void ROSBridgeStateChanged(EROSState ROSState);
274
275 /*
276 * Wheeled vehicle parameters. Does nothing for drone.
277 */
278 UPROPERTY(Category = Vehicle, VisibleAnywhere, BlueprintReadWrite)
279 FWheeledVehicleParameters VehicleParameters;
280
281 /*
282 * Manages sensors attached to this vehicle
283 */
284 UPROPERTY(Category = Vehicle, VisibleAnywhere, BlueprintReadOnly)
285 TObjectPtr<USensorsManagerComponent> SensorsManager;
286
287 UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
288 ACollisionSensor* CollisionSensor = nullptr;
289
290 UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
291 ATransformSensor* TransformSensor = nullptr;
292
293 UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
294 AOverlapSensor* OverlapSensor = nullptr;
295
296 UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
297 UNiagaraComponent* NiagaraComponent = nullptr;
298
299 // Extra transform sensor positions for vehicle
300 // Added in BP_Forwarder and BP_Harvester BeginPlay.
301 UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
302 TArray<UStaticMeshComponent*> ExtraTransformSensorPositions;
303
304 UPROPERTY(VisibleAnywhere)
305 FString ActorName;
306
307 UPROPERTY(VisibleAnywhere)
308 FString ActorID;
309
310 UPROPERTY(EditAnywhere, BlueprintReadWrite)
311 FTransform OriginalCameraTransform;
312
313 FTransform MovedFromGarageTransform;
314
315 bool VehicleInGarage = false;
316
317 TArray<ATransformSensor*> ExtraTransformSensors;
318};
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:162
FString ExportToJsonFile(const FString &FileName)
Definition: Sensor.cpp:147
virtual FText GetInteractableName_Implementation() const override
Definition: Vehicle.h:192
virtual FString GetActorID_Implementation() const override
Definition: Vehicle.h:202
virtual void SetActorIDAndName_Implementation(const FString &NewActorName, const FString &NewID) override
Definition: Vehicle.h:230
virtual FString GetActorInformation_Implementation() const override
Definition: Vehicle.h:212
virtual FString GetActorName_Implementation() const override
Definition: Vehicle.h:207
virtual FTransform GetInteractableWorldTransform_Implementation() const override
Definition: Vehicle.h:197
virtual void SetActorName_Implementation(const FString &NewActorName) override
Definition: Vehicle.h:225
static void SetAndValidateActorIDAndName(FString &ActorName, FString &ActorID, TWeakObjectPtr< AActor > Actor)
static FString ConvertVehicleTypeToString(EVehicleTypes VehicleType)