Agrarsense
InstancedActor.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/Actor.h"
10#include "Engine/EngineTypes.h"
11#include "Engine/StaticMesh.h"
12#include "Components/StaticMeshComponent.h"
13#include "Internationalization/Text.h"
14
18
19#include "InstancedActor.generated.h"
20
38UCLASS()
39class AGRARSENSE_API AInstancedActor : public AActor, public IInteractable, public IDestroyable, public IActorInformation
40{
41 GENERATED_BODY()
42
43public:
44
45 AInstancedActor(const FObjectInitializer& ObjectInitializer);
46
47 virtual void BeginPlay() override;
48
49 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
50
55 UFUNCTION(BlueprintCallable)
56 bool AddToInstancedRendering();
57
58
59 void InstanceAdded();
60
65 UFUNCTION(BlueprintCallable)
66 void SetTypeAndModel(const FString& Type, const FString& Model)
67 {
68 TypeID = Type;
69 ModelID = Model;
70 }
71
72 /*
73 * Get whether this actor is a tree.
74 */
75 UFUNCTION(BlueprintCallable)
76 bool IsTreeActor() const;
77
82 void UpdatePreviousTransform(const FTransform& NewTransform)
83 {
84 PreviousTransform = NewTransform;
85 }
86
91 UFUNCTION(BlueprintPure)
92 bool IsAddedToInstancedRendering() const
93 {
94 return AddedToInstancedRenderer;
95 }
96
97 UFUNCTION(BlueprintPure)
98 UStaticMeshComponent* GetStaticMeshComponent() const
99 {
100 return StaticMeshComponent;
101 }
102
103 UFUNCTION(BlueprintPure)
104 int32 GetInstanceStartCullDistance() const
105 {
106 return InstanceStartCullDistanceInCm;
107 }
108
109 UFUNCTION(BlueprintPure)
110 int32 GetInstanceEndCullDistance() const
111 {
112 return InstanceEndCullDistanceInCm;
113 }
114
115 UFUNCTION(BlueprintPure)
116 bool UpdateTransformAutomatically() const
117 {
118 return ShouldUpdateTransformAutomatically;
119 }
120
121 UFUNCTION(BlueprintCallable)
122 FString GetTypeIDString() const
123 {
124 return TypeID;
125 }
126
127 UFUNCTION(BlueprintCallable)
128 FString GetModelIDString() const
129 {
130 return ModelID;
131 }
132
134 {
135 return AlternativeMaterial;
136 }
137
139 {
140 return CustomDepthSetup;
141 }
142
144 {
145 return AllowWorldPositionOffsetDisable;
146 }
147
148 FTransform GetPreviousTransform() const
149 {
150 return PreviousTransform;
151 }
152
153 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
154 UStaticMeshComponent* StaticMeshComponent = nullptr;
155
156 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
157 bool AllowWorldPositionOffsetDisable = false;
158
159 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
160 bool AddToInstancedRenderer = true;
161
162 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
163 int InstanceStartCullDistanceInCm = 45000;
164
165 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
166 int InstanceEndCullDistanceInCm = 46500;
167
168 // Should this actor transform be automatically updated (more expensive)
169 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
170 bool ShouldUpdateTransformAutomatically = false;
171
172 // If we have multiple actors with same mesh but with different material(s), this should be set to true!
173 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
174 bool AlternativeMaterial = false;
175
176 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AInstancedActor")
177 FText InteractableName;
178
179 virtual FText GetInteractableName_Implementation() const override
180 {
181 return InteractableName;
182 }
183
184 virtual FTransform GetInteractableWorldTransform_Implementation() const override
185 {
186 return GetActorTransform();
187 }
188
189 virtual FString GetActorID_Implementation() const override
190 {
191 return ActorID;
192 }
193
194 virtual FString GetActorName_Implementation() const override
195 {
196 return ActorName;
197 }
198
199 virtual void SetActorName_Implementation(const FString& NewActorName) override
200 {
201 ActorName = NewActorName;
202 }
203
204 virtual void SetActorIDAndName_Implementation(const FString& NewActorName, const FString& NewID) override
205 {
206 ActorName = NewActorName;
207 ActorID = NewID;
208 SetAndValidateActorIDAndName(ActorName, ActorID, TWeakObjectPtr<AActor>(this));
209 }
210
211private:
212
213 UPROPERTY(VisibleAnywhere)
214 FString ActorName;
215
216 UPROPERTY(VisibleAnywhere)
217 FString ActorID;
218
219 FTransform PreviousTransform;
220
221 bool AddedToInstancedRenderer = false;
222
223 FString TypeID = "none";
224
225 FString ModelID = "none";
226
227 bool CustomDepthSetup = false;
228
229};
virtual void SetActorIDAndName_Implementation(const FString &NewActorName, const FString &NewID) override
FTransform GetPreviousTransform() const
bool HasAlternativeMaterial() const
virtual void SetActorName_Implementation(const FString &NewActorName) override
virtual FString GetActorID_Implementation() const override
virtual FTransform GetInteractableWorldTransform_Implementation() const override
void UpdatePreviousTransform(const FTransform &NewTransform)
bool IsCustomDepthSetup() const
bool GetAllowWorldPositionOffsetDisable() const
virtual FString GetActorName_Implementation() const override