A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
VRGripScriptBase.cpp
Go to the documentation of this file.
1// Fill out your copyright notice in the Description page of Project Settings.
2
5#include "VRGripInterface.h"
6#include "Engine/BlueprintGeneratedClass.h"
7#include "Engine/NetDriver.h"
8
9
10UVRGripScriptBase::UVRGripScriptBase(const FObjectInitializer& ObjectInitializer)
11 : Super(ObjectInitializer)
12{
13// PrimaryComponentTick.bCanEverTick = false;
14// PrimaryComponentTick.bStartWithTickEnabled = false;
15// PrimaryComponentTick.TickGroup = ETickingGroup::TG_PrePhysics;
17 bDenyAutoDrop = false;
18 bDenyLateUpdates = false;
19 bForceDrop = false;
20 bIsActive = false;
21
22 bCanEverTick = false;
23 bAllowTicking = false;
24}
25
26void UVRGripScriptBase::OnEndPlay_Implementation(const EEndPlayReason::Type EndPlayReason) {};
28
29bool UVRGripScriptBase::GetWorldTransform_Implementation(UGripMotionControllerComponent* GrippingController, float DeltaTime, FTransform & WorldTransform, const FTransform &ParentTransform, FBPActorGripInformation &Grip, AActor * actor, UPrimitiveComponent * root, bool bRootHasInterface, bool bActorHasInterface, bool bIsForTeleport) { return true; }
31void UVRGripScriptBase::OnGripRelease_Implementation(UGripMotionControllerComponent * ReleasingController, const FBPActorGripInformation & GripInformation, bool bWasSocketed) {}
34
35
38//bool UVRGripScriptBase::Wants_DenyAutoDrop() { return bDenyAutoDrop; }
39//bool UVRGripScriptBase::Wants_DenyLateUpdates() { return bDenyLateUpdates; }
40//bool UVRGripScriptBase::Wants_ToForceDrop() { return bForceDrop; }
44
45UVRGripScriptBase* UVRGripScriptBase::GetGripScriptByClass(UObject* WorldContextObject, TSubclassOf<UVRGripScriptBase> GripScriptClass, EBPVRResultSwitch& Result)
46{
47 if (WorldContextObject->GetClass()->ImplementsInterface(UVRGripInterface::StaticClass()))
48 {
49 TArray<UVRGripScriptBase*> GripScripts;
50 if (IVRGripInterface::Execute_GetGripScripts(WorldContextObject, GripScripts))
51 {
52 for (UVRGripScriptBase* Script : GripScripts)
53 {
54 if (Script && Script->IsA(GripScriptClass))
55 {
57 return Script;
58 }
59 }
60 }
61 }
62
64 return nullptr;
65}
66
67void UVRGripScriptBase::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
68{
69 // Uobject has no replicated props
70 //Super::GetLifetimeReplicatedProps(OutLifetimeProps);
71
72 // Replicate here if required
73 UBlueprintGeneratedClass* BPClass = Cast<UBlueprintGeneratedClass>(GetClass());
74 if (BPClass != NULL)
75 {
76 BPClass->GetLifetimeBlueprintReplicationList(OutLifetimeProps);
77 }
78}
79
80void UVRGripScriptBase::Tick(float DeltaTime)
81{
82 // Do nothing by default
83}
84
86{
87 return bAllowTicking;
88}
89
91{
92 return GetWorld();
93}
94
96{
97 return false;
98}
99
101{
102 return false;
103}
104
106{
107 if(IsTemplate(RF_ClassDefaultObject))
108 return ETickableTickType::Never;
109
110 return bCanEverTick ? ETickableTickType::Conditional : ETickableTickType::Never;
111}
112
114{
115 RETURN_QUICK_DECLARE_CYCLE_STAT(UVRGripScriptBase, STATGROUP_Tickables);
116}
117
119{
120 bAllowTicking = bTickEnabled;
121}
122
123
124// Not currently compiling in editor builds....not entirely sure why...
125/*
126void UVRGripScriptBase::PreReplication(IRepChangedPropertyTracker & ChangedPropertyTracker)
127{
128
129 // In the grippables pre replication to pass it on
130#ifndef WITH_EDITOR
131 // Run pre-replication for any grip scripts
132 if (GripLogicScripts.Num())
133 {
134 if (UNetDriver* NetDriver = GetNetDriver())
135 {
136 for (UVRGripScriptBase* Script : GripLogicScripts)
137 {
138 if (Script && !Script->IsPendingKill())
139 {
140 Script->PreReplication(*((IRepChangedPropertyTracker *)NetDriver->FindOrCreateRepChangedPropertyTracker(Script).Get()));
141 }
142 }
143 }
144 }
145#endif
146
147 UBlueprintGeneratedClass* BPClass = Cast<UBlueprintGeneratedClass>(GetClass());
148 if (BPClass != NULL)
149 {
150 BPClass->InstancePreReplication(this, ChangedPropertyTracker);
151 }
152}*/
153
154bool UVRGripScriptBase::CallRemoteFunction(UFunction * Function, void * Parms, FOutParmRec * OutParms, FFrame * Stack)
155{
156 bool bProcessed = false;
157
158 if (AActor* MyOwner = GetOwner())
159 {
160 FWorldContext* const Context = GEngine->GetWorldContextFromWorld(GetWorld());
161 if (Context != nullptr)
162 {
163 for (FNamedNetDriver& Driver : Context->ActiveNetDrivers)
164 {
165 if (Driver.NetDriver != nullptr && Driver.NetDriver->ShouldReplicateFunction(MyOwner, Function))
166 {
167 Driver.NetDriver->ProcessRemoteFunction(MyOwner, Function, Parms, OutParms, Stack, this);
168
169 bProcessed = true;
170 }
171 }
172 }
173 }
174
175 return bProcessed;
176}
177
178int32 UVRGripScriptBase::GetFunctionCallspace(UFunction * Function, FFrame * Stack)
179{
180 AActor* Owner = GetOwner();
181
182 if (HasAnyFlags(RF_ClassDefaultObject) || !IsSupportedForNetworking() || !Owner)
183 {
184 // This handles absorbing authority/cosmetic
185 return GEngine->GetGlobalFunctionCallspace(Function, this, Stack);
186 }
187
188 // Owner is certified valid now
189 return Owner->GetFunctionCallspace(Function, Stack);
190}
191
192FTransform UVRGripScriptBase::GetGripTransform(const FBPActorGripInformation &Grip, const FTransform & ParentTransform)
193{
194 return Grip.RelativeTransform * Grip.AdditionTransform * ParentTransform;
195}
196
198{
199 UObject* ParentObj = this->GetParent();
200
201 if (USceneComponent * PrimParent = Cast<USceneComponent>(ParentObj))
202 {
203 return PrimParent;
204 }
205 else if (AActor * ParentActor = Cast<AActor>(ParentObj))
206 {
207 return ParentActor->GetRootComponent();
208 }
209
210 return nullptr;
211}
212
213FTransform UVRGripScriptBase::GetParentTransform(bool bGetWorldTransform, FName BoneName)
214{
215 UObject* ParentObj = this->GetParent();
216
217 if (USceneComponent* PrimParent = Cast<USceneComponent>(ParentObj))
218 {
219 if (BoneName != NAME_None)
220 {
221 return PrimParent->GetSocketTransform(BoneName);
222 }
223 else
224 {
225 return PrimParent->GetComponentTransform();
226 }
227 }
228 else if (AActor* ParentActor = Cast<AActor>(ParentObj))
229 {
230 return ParentActor->GetActorTransform();
231 }
232
233 return FTransform::Identity;
234}
235
236FBodyInstance * UVRGripScriptBase::GetParentBodyInstance(FName OptionalBoneName)
237{
238 UObject * ParentObj = this->GetParent();
239
240 if (UPrimitiveComponent * PrimParent = Cast<UPrimitiveComponent>(ParentObj))
241 {
242 return PrimParent->GetBodyInstance(OptionalBoneName);
243 }
244 else if (AActor * ParentActor = Cast<AActor>(ParentObj))
245 {
246 if (UPrimitiveComponent * Prim = Cast<UPrimitiveComponent>(ParentActor->GetRootComponent()))
247 {
248 return Prim->GetBodyInstance(OptionalBoneName);
249 }
250 }
251
252 return nullptr;
253}
254
256{
257 return this->GetOuter();
258}
259
261{
262 UObject * myOuter = this->GetOuter();
263
264 if (!myOuter)
265 return nullptr;
266
267 if (AActor * ActorOwner = Cast<AActor>(myOuter))
268 {
269 return ActorOwner;
270 }
271 else if (UActorComponent * ComponentOwner = Cast<UActorComponent>(myOuter))
272 {
273 return ComponentOwner->GetOwner();
274 }
275
276 return nullptr;
277}
278
280{
281 if (AActor * MyOwner = GetOwner())
282 {
283 return MyOwner->GetLocalRole() == ROLE_Authority;
284 }
285
286 return false;
287}
288
290{
291 if (AActor * MyOwner = GetOwner())
292 {
293 return MyOwner->GetNetMode() < ENetMode::NM_Client;
294 }
295
296 return false;
297}
298
300{
301 if (IsTemplate())
302 return nullptr;
303
304 if (GIsEditor && !GIsPlayInEditorWorld)
305 {
306 return nullptr;
307 }
308 else if (UObject * Outer = GetOuter())
309 {
310 return Outer->GetWorld();
311 }
312
313 return nullptr;
314}
315
316void UVRGripScriptBase::EndPlay(const EEndPlayReason::Type EndPlayReason)
317{
318 OnEndPlay(EndPlayReason);
319}
320
322{
324 return;
325
327
328 // Notify the subscripts about begin play
329 OnBeginPlay(CallingOwner);
330}
331
333{
334 Super::PostInitProperties();
335
336 //Called in game, when World exist . BeginPlay will not be called in editor
337 if (GetWorld())
338 {
339 if (AActor* Owner = GetOwner())
340 {
341 if (Owner->IsActorInitialized())
342 {
344 }
345 }
346 }
347}
348
349void UVRGripScriptBaseBP::Tick(float DeltaTime)
350{
351 ReceiveTick(DeltaTime);
352}
EBPVRResultSwitch
UENUM()
EGSTransformOverrideType
UENUM(Blueprintable)
UCLASS(Blueprintable, meta = (BlueprintSpawnableComponent), ClassGroup = MotionController)
void ReceiveTick(float DeltaSeconds)
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "Tick"))
virtual void Tick(float DeltaTime) override
UCLASS(NotBlueprintable, BlueprintType, EditInlineNew, DefaultToInstanced, Abstract,...
virtual bool IsTickable() const override
void OnBeginPlay(UObject *CallingOwner)
UFUNCTION(BlueprintNativeEvent, Category = "VRGripScript")
virtual void PostInitProperties() override
bool bDenyAutoDrop
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "GSSettings")
virtual void HandlePostPhysicsHandle(UGripMotionControllerComponent *GrippingController, FBPActorPhysicsHandleInformation *HandleInfo)
FBodyInstance * GetParentBodyInstance(FName OptionalBoneName=NAME_None)
virtual void OnGripRelease_Implementation(UGripMotionControllerComponent *ReleasingController, const FBPActorGripInformation &GripInformation, bool bWasSocketed=false)
virtual bool Wants_DenyTeleport_Implementation(UGripMotionControllerComponent *Controller)
FTransform GetGripTransform(const FBPActorGripInformation &Grip, const FTransform &ParentTransform)
UFUNCTION(BlueprintPure, Category = "VRGripScript")
virtual UWorld * GetTickableGameObjectWorld() const override
virtual bool IsTickableInEditor() const
FTransform GetParentTransform(bool bGetWorldTransform=true, FName BoneName=NAME_None)
UFUNCTION(BlueprintPure, Category = "VRGripScript")
void OnEndPlay(const EEndPlayReason::Type EndPlayReason)
UFUNCTION(BlueprintNativeEvent, Category = "VRGripScript")
bool bForceDrop
UPROPERTY(BlueprintReadWrite, Category = "GSSettings")
virtual void GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > &OutLifetimeProps) const override
virtual void OnEndPlay_Implementation(const EEndPlayReason::Type EndPlayReason)
virtual void Tick(float DeltaTime) override
virtual ETickableTickType GetTickableTickType() const
bool bAllowTicking
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "TickSettings")
virtual UWorld * GetWorld() const override
EGSTransformOverrideType GetWorldTransformOverrideType()
bool IsServer()
UFUNCTION(BlueprintPure, Category = "VRGripScript")
virtual void OnSecondaryGrip_Implementation(UGripMotionControllerComponent *Controller, USceneComponent *SecondaryGripComponent, const FBPActorGripInformation &GripInformation)
virtual void OnBeginPlay_Implementation(UObject *CallingOwner)
void BeginPlay(UObject *CallingOwner)
virtual int32 GetFunctionCallspace(UFunction *Function, FFrame *Stack) override
bool bDenyLateUpdates
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "GSSettings")
virtual void OnSecondaryGripRelease_Implementation(UGripMotionControllerComponent *Controller, USceneComponent *ReleasingSecondaryGripComponent, const FBPActorGripInformation &GripInformation)
virtual bool GetWorldTransform_Implementation(UGripMotionControllerComponent *OwningController, float DeltaTime, FTransform &WorldTransform, const FTransform &ParentTransform, FBPActorGripInformation &Grip, AActor *actor, UPrimitiveComponent *root, bool bRootHasInterface, bool bActorHasInterface, bool bIsForTeleport)
bool IsSupportedForNetworking() const override
EGSTransformOverrideType WorldTransformOverrideType
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "GSSettings")
UVRGripScriptBase(const FObjectInitializer &ObjectInitializer)
static UVRGripScriptBase * GetGripScriptByClass(UObject *WorldContextObject, TSubclassOf< UVRGripScriptBase > GripScriptClass, EBPVRResultSwitch &Result)
UFUNCTION(BlueprintCallable, Category = "VRGripScript|Functions", meta = (WorldContext = "WorldContex...
virtual void OnGrip_Implementation(UGripMotionControllerComponent *GrippingController, const FBPActorGripInformation &GripInformation)
virtual void HandlePrePhysicsHandle(UGripMotionControllerComponent *GrippingController, const FBPActorGripInformation &GripInfo, FBPActorPhysicsHandleInformation *HandleInfo, FTransform &KinPose)
bool HasAuthority()
UFUNCTION(BlueprintPure, Category = "VRGripScript")
bool bIsActive
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "GSSettings")
AActor * GetOwner()
UFUNCTION(BlueprintPure, Category = "VRGripScript")
void EndPlay(const EEndPlayReason::Type EndPlayReason)
virtual TStatId GetStatId() const override
void SetTickEnabled(bool bTickEnabled)
UFUNCTION(BlueprintCallable, Category = "TickSettings")
bool bCanEverTick
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "TickSettings")
virtual bool IsTickableWhenPaused() const override
USceneComponent * GetParentSceneComp()
UFUNCTION(BlueprintCallable, Category = "VRGripScript")
UObject * GetParent()
UFUNCTION(BlueprintPure, Category = "VRGripScript")
virtual bool CallRemoteFunction(UFunction *Function, void *Parms, FOutParmRec *OutParms, FFrame *Stack) override
USTRUCT(BlueprintType, Category = "VRExpansionLibrary")
FTransform AdditionTransform
UPROPERTY(BlueprintReadWrite, NotReplicated, Category = "Settings")
FTransform_NetQuantize RelativeTransform
UPROPERTY(BlueprintReadWrite, Category = "Settings")
USTRUCT(BlueprintType, Category = "VRExpansionLibrary")