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