A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
GrippablePhysicsReplication.h
Go to the documentation of this file.
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "VRGlobalSettings.h"
7#include "Engine/Classes/GameFramework/PlayerController.h"
8#include "Engine/Classes/GameFramework/PlayerState.h"
9#include "Engine/Player.h"
10#include "PhysicsEngine/PhysicsSettings.h"
11#include "Components/SkeletalMeshComponent.h"
12
13#if PHYSICS_INTERFACE_PHYSX
14#include "Physics/PhysScene_PhysX.h"
15#include "PhysXPublicCore.h"
16//#include "PhysXPublic.h"
17#include "PhysXIncludes.h"
18#endif
19
20#include "Physics/PhysicsInterfaceUtils.h"
21#include "PhysicsInterfaceTypesCore.h"
22#include "PhysicsReplication.h"
23
24#include "Misc/ScopeRWLock.h"
25
26#include "GrippablePhysicsReplication.generated.h"
27//#include "GrippablePhysicsReplication.generated.h"
28
29
30//DECLARE_DYNAMIC_MULTICAST_DELEGATE(FVRPhysicsReplicationDelegate, void, Return);
31
32/*static TAutoConsoleVariable<int32> CVarEnableCustomVRPhysicsReplication(
33 TEXT("vr.VRExpansion.EnableCustomVRPhysicsReplication"),
34 0,
35 TEXT("Enable valves input controller that overrides legacy input.\n")
36 TEXT(" 0: use the engines default input mapping (default), will also be default if vr.SteamVR.EnableVRInput is enabled\n")
37 TEXT(" 1: use the valve input controller. You will have to define input bindings for the controllers you want to support."),
38 ECVF_ReadOnly);*/
39
40//#if PHYSICS_INTERFACE_PHYSX
41struct FAsyncPhysicsRepCallbackDataVR;
42class FPhysicsReplicationAsyncCallbackVR;
43
45{
46public:
47
48 FPhysScene* PhysSceneVR;
49
50 FPhysicsReplicationVR(FPhysScene* PhysScene);
52 static bool IsInitialized();
53
54 virtual void OnTick(float DeltaSeconds, TMap<TWeakObjectPtr<UPrimitiveComponent>, FReplicatedPhysicsTarget>& ComponentsToTargets) override;
55 virtual bool ApplyRigidBodyState(float DeltaSeconds, FBodyInstance* BI, FReplicatedPhysicsTarget& PhysicsTarget, const FRigidBodyErrorCorrection& ErrorCorrection, const float PingSecondsOneWay) override;
56#if WITH_CHAOS
57
58 static void ApplyAsyncDesiredStateVR(float DeltaSeconds, const FAsyncPhysicsRepCallbackDataVR* Input);
59
60 FPhysicsReplicationAsyncCallbackVR* AsyncCallbackServer;
61
62 void PrepareAsyncData_ExternalVR(const FRigidBodyErrorCorrection& ErrorCorrection); //prepare async data for writing. Call on external thread (i.e. game thread)
63 FAsyncPhysicsRepCallbackDataVR* CurAsyncDataVR; //async data being written into before we push into callback
64 friend FPhysicsReplicationAsyncCallback;
65#endif
66};
67
69{
70public:
71
72 virtual FPhysicsReplication* Create(FPhysScene* OwningPhysScene)
73 {
74 return new FPhysicsReplicationVR(OwningPhysScene);
75 }
76
77 virtual void Destroy(FPhysicsReplication* PhysicsReplication)
78 {
79 if (PhysicsReplication)
80 delete PhysicsReplication;
81 }
82};
83
85{
86 FPhysicsActorHandle Actor1;
87 FPhysicsActorHandle Actor2;
88 TWeakObjectPtr<UPrimitiveComponent> Prim1;
89 TWeakObjectPtr<UPrimitiveComponent> Prim2;
90
91 FORCEINLINE bool operator==(const FContactModBodyInstancePair &Other) const
92 {
93 return (
94 (Actor1 == Other.Actor1 || Actor1 == Other.Actor2) &&
95 (Actor2 == Other.Actor2 || Actor2 == Other.Actor1)
96 );
97 }
98};
99
100#if PHYSICS_INTERFACE_PHYSX
101class FContactModifyCallbackVR : public FContactModifyCallback
102{
103public:
104
105 TArray<FContactModBodyInstancePair> ContactsToIgnore;
106 FRWLock RWAccessLock;
107
108 void onContactModify(PxContactModifyPair* const pairs, PxU32 count) override;
109
110 virtual ~FContactModifyCallbackVR()
111 {
112
113 }
114};
115
116class FCCDContactModifyCallbackVR : public FCCDContactModifyCallback
117{
118public:
119
120 TArray<FContactModBodyInstancePair> ContactsToIgnore;
121 FRWLock RWAccessLock;
122
123 void onCCDContactModify(PxContactModifyPair* const pairs, PxU32 count) override;
124
125 virtual ~FCCDContactModifyCallbackVR()
126 {
127
128 }
129};
130
131class IContactModifyCallbackFactoryVR : public IContactModifyCallbackFactory
132{
133public:
134
135 virtual FContactModifyCallback* Create(FPhysScene* OwningPhysScene) override
136 {
137 return new FContactModifyCallbackVR();
138 }
139
140 virtual void Destroy(FContactModifyCallback* ContactCallback) override
141 {
142 if (ContactCallback)
143 delete ContactCallback;
144 }
145};
146
147class ICCDContactModifyCallbackFactoryVR : public ICCDContactModifyCallbackFactory
148{
149public:
150
151 virtual FCCDContactModifyCallback* Create(FPhysScene* OwningPhysScene) override
152 {
153 return new FCCDContactModifyCallbackVR();
154 }
155
156 virtual void Destroy(FCCDContactModifyCallback* ContactCallback) override
157 {
158 if (ContactCallback)
159 delete ContactCallback;
160 }
161};
162#endif
163
164//#endif
165
166USTRUCT()
167struct VREXPANSIONPLUGIN_API FRepMovementVR : public FRepMovement
168{
169 GENERATED_USTRUCT_BODY()
170public:
174 void CopyTo(FRepMovement& other) const;
175 bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess);
176 bool GatherActorsMovement(AActor* OwningActor);
177};
178
179template<>
180struct TStructOpsTypeTraits<FRepMovementVR> : public TStructOpsTypeTraitsBase2<FRepMovementVR>
181{
182 enum
183 {
184 WithNetSerializer = true,
185 WithNetSharedSerialization = true,
186 };
188
189USTRUCT(BlueprintType)
190struct VREXPANSIONPLUGIN_API FVRClientAuthReplicationData
191{
192 GENERATED_BODY()
193public:
194
195 // If True and we are using a client auth grip type then we will replicate our throws on release
196 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRReplication")
197 bool bUseClientAuthThrowing;
198
199 // Rate that we will be sending throwing events to the server, not replicated, only serialized
200 UPROPERTY(EditAnywhere, NotReplicated, BlueprintReadOnly, Category = "VRReplication", meta = (ClampMin = "0", UIMin = "0", ClampMax = "100", UIMax = "100"))
201 int32 UpdateRate;
202
203 FTimerHandle ResetReplicationHandle;
204 FTransform LastActorTransform;
205 float TimeAtInitialThrow;
206 bool bIsCurrentlyClientAuth;
207
209 bUseClientAuthThrowing(false),
210 UpdateRate(30),
211 LastActorTransform(FTransform::Identity),
212 TimeAtInitialThrow(0.0f),
213 bIsCurrentlyClientAuth(false)
214 {
216 }
FPhysicsReplicationVR(FPhysScene *PhysScene)
virtual bool ApplyRigidBodyState(float DeltaSeconds, FBodyInstance *BI, FReplicatedPhysicsTarget &PhysicsTarget, const FRigidBodyErrorCorrection &ErrorCorrection, const float PingSecondsOneWay) override
virtual void OnTick(float DeltaSeconds, TMap< TWeakObjectPtr< UPrimitiveComponent >, FReplicatedPhysicsTarget > &ComponentsToTargets) override
virtual void Destroy(FPhysicsReplication *PhysicsReplication)
virtual FPhysicsReplication * Create(FPhysScene *OwningPhysScene)
TWeakObjectPtr< UPrimitiveComponent > Prim1
TWeakObjectPtr< UPrimitiveComponent > Prim2
FORCEINLINE bool operator==(const FContactModBodyInstancePair &Other) const
int32 UpdateRate
UPROPERTY(EditAnywhere, NotReplicated, BlueprintReadOnly, Category = "VRReplication",...
bool bUseClientAuthThrowing
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRReplication")