From 1a64805d43d3f4e739886cb922b78007e5ae796a Mon Sep 17 00:00:00 2001 From: Simeon Wallrath Date: Thu, 20 Nov 2025 16:26:22 +0100 Subject: [PATCH] Up to Unreal 5.7 --- .gitmodules | 3 + VIRTUOS_ExpansionPluginTests/.vsconfig | 2 + .../Plugins/AdvancedSessions/.gitattributes | 2 - .../Plugins/AdvancedSessions/.gitignore | 10 - .../AdvancedSessions.uplugin | 4 +- .../Config/FilterPlugin.ini | 0 .../Plugins/AdvancedSessions/LICENSE.txt | 19 - .../Plugins/AdvancedSessions/README.md | 7 - .../Resources/Icon128.png | 0 .../AdvancedSessions.Build.cs | 3 + .../Classes/AdvancedExternalUILibrary.h | 0 .../Classes/AdvancedFriendsGameInstance.h | 17 + .../Classes/AdvancedFriendsInterface.h | 0 .../Classes/AdvancedFriendsLibrary.h | 0 .../Classes/AdvancedGameSession.h | 0 .../Classes/AdvancedIdentityLibrary.h | 0 .../Classes/AdvancedSessions.h | 0 .../Classes/AdvancedSessionsLibrary.h | 4 + .../Classes/AdvancedVoiceLibrary.h | 0 .../Classes/AutoLoginUserCallbackProxy.h | 0 .../Classes/BlueprintDataDefinitions.h | 0 .../Classes/CancelFindSessionsCallbackProxy.h | 0 .../CreateSessionCallbackProxyAdvanced.h | 4 +- .../Classes/EndSessionCallbackProxy.h | 0 .../Classes/FindFriendSessionCallbackProxy.h | 0 .../FindSessionsCallbackProxyAdvanced.h | 4 +- .../Classes/GetFriendsCallbackProxy.h | 0 .../Classes/GetRecentPlayersCallbackProxy.h | 0 .../Classes/GetUserPrivilegeCallbackProxy.h | 0 .../Classes/LoginUserCallbackProxy.h | 0 .../Classes/LogoutUserCallbackProxy.h | 0 .../Classes/OnlineSubSystemHeader.h | 0 .../Classes/SendFriendInviteCallbackProxy.h | 0 .../StartSessionCallbackProxyAdvanced.h | 0 .../UpdateSessionCallbackProxyAdvanced.h | 8 +- .../Private/AdvancedExternalUILibrary.cpp | 0 .../Private/AdvancedFriendsGameInstance.cpp | 73 ++ .../Private/AdvancedFriendsInterface.cpp | 0 .../Private/AdvancedFriendsLibrary.cpp | 3 + .../Private/AdvancedIdentityLibrary.cpp | 0 .../Private/AdvancedSessions.cpp | 0 .../Private/AdvancedSessionsLibrary.cpp | 11 + .../Private/AdvancedVoiceLibrary.cpp | 0 .../Private/AutoLoginUserCallbackProxy.cpp | 2 + .../CancelFindSessionsCallbackProxy.cpp | 0 .../CreateSessionCallbackProxyAdvanced.cpp | 8 +- .../Private/EndSessionCallbackProxy.cpp | 0 .../FindFriendSessionCallbackProxy.cpp | 8 + .../FindSessionsCallbackProxyAdvanced.cpp | 21 +- .../Private/GetFriendsCallbackProxy.cpp | 0 .../Private/GetRecentPlayersCallbackProxy.cpp | 0 .../Private/GetUserPrivilegeCallbackProxy.cpp | 0 .../Private/LoginUserCallbackProxy.cpp | 0 .../Private/LogoutUserCallbackProxy.cpp | 0 .../Private/SendFriendInviteCallbackProxy.cpp | 0 .../StartSessionCallbackProxyAdvanced.cpp | 0 .../UpdateSessionCallbackProxyAdvanced.cpp | 9 +- .../AdvancedSteamSessions.uplugin | 6 +- .../Config/FilterPlugin.ini | 0 .../Resources/Icon128.png | 0 .../AdvancedSteamSessions.Build.cs | 4 + .../Classes/AdvancedSteamFriendsLibrary.h | 6 +- .../Classes/AdvancedSteamSessions.h | 0 .../Classes/AdvancedSteamWorkshopLibrary.h | 0 .../Classes/SteamNotificationsSubsystem.h | 24 +- .../SteamRequestGroupOfficersCallbackProxy.h | 0 .../SteamWSRequestUGCDetailsCallbackProxy.h | 0 .../Private/AdvancedSteamFriendsLibrary.cpp | 22 +- .../Private/AdvancedSteamSessions.cpp | 0 .../Private/AdvancedSteamWorkshopLibrary.cpp | 0 ...SteamRequestGroupOfficersCallbackProxy.cpp | 0 .../SteamWSRequestUGCDetailsCallbackProxy.cpp | 0 .../Config/FilterPlugin.ini | 0 .../OpenXRExpansionPlugin.uplugin | 4 +- .../Resources/Icon128.png | 0 .../OpenXRExpansionEditor.Build.cs | 0 .../AnimGraphNode_ApplyOpenXRHandPose.cpp | 0 .../Private/OpenXRExpansionEditor.cpp | 0 .../AnimGraphNode_ApplyOpenXRHandPose.h | 0 .../Public/OpenXRExpansionEditor.h | 0 .../OpenXRExpansionPlugin.Build.cs | 0 .../Private/AnimNode_ApplyOpenXRHandPose.cpp | 0 .../OpenXRExpansionFunctionLibrary.cpp | 66 +- .../Private/OpenXRExpansionPlugin.cpp | 0 .../Private/OpenXRHandPoseComponent.cpp | 0 ...FBPXRSkeletalRepContainerNetSerializer.cpp | 340 ++++++++ .../Public/AnimNode_ApplyOpenXRHandPose.h | 0 .../Public/OpenXRExpansionFunctionLibrary.h | 2 +- .../Public/OpenXRExpansionPlugin.h | 0 .../Public/OpenXRExpansionTypes.h | 6 + .../Public/OpenXRHandPoseComponent.h | 0 .../FBPXRSkeletalRepContainerNetSerializer.h | 16 + VIRTUOS_ExpansionPluginTests/Plugins/SPUD | 2 +- .../Plugins/StevesUEHelpers | 2 +- .../Plugins/VRExpansionPlugin/.gitattributes | 2 - .../Plugins/VRExpansionPlugin/.gitignore | 10 - .../Config/FilterPlugin.ini | 0 .../Plugins/VRExpansionPlugin/LICENSE.txt | 19 - .../Plugins/VRExpansionPlugin/README.md | 48 -- .../Resources/Icon128.png | 0 .../Private/HandSocketComponentDetails.cpp | 0 .../Private/HandSocketVisualizer.cpp | 0 .../Private/VRExpansionEditor.cpp | 0 .../Private/VRGlobalSettingsDetails.cpp | 0 .../Public/HandSocketComponentDetails.h | 0 .../Public/HandSocketVisualizer.h | 0 .../Public/VRExpansionEditor.h | 0 .../Public/VRGlobalSettingsDetails.h | 0 .../VRExpansionEditor.Build.cs | 0 .../Private/CharacterMovementCompTypes.cpp | 0 .../Private/GripMotionControllerComponent.cpp | 73 +- .../Private/GripScripts/GS_Default.cpp | 0 .../Private/GripScripts/GS_GunTools.cpp | 0 .../GripScripts/GS_InteractibleSettings.cpp | 0 .../Private/GripScripts/GS_LerpToHand.cpp | 0 .../Private/GripScripts/GS_Melee.cpp | 0 .../Private/GripScripts/GS_Physics.cpp | 0 .../Private/GripScripts/VRGripScriptBase.cpp | 0 .../Private/Grippables/GrippableActor.cpp | 18 +- .../Grippables/GrippableBoxComponent.cpp | 2 +- .../Grippables/GrippableCapsuleComponent.cpp | 2 +- .../Private/Grippables/GrippableCharacter.cpp | 0 .../Private/Grippables/GrippableDataTypes.cpp | 7 +- .../GrippablePhysicsReplication.cpp | 61 +- .../Grippables/GrippableSkeletalMeshActor.cpp | 18 +- .../GrippableSkeletalMeshComponent.cpp | 2 +- .../Grippables/GrippableSphereComponent.cpp | 2 +- .../Grippables/GrippableStaticMeshActor.cpp | 18 +- .../GrippableStaticMeshComponent.cpp | 2 +- .../Grippables/HandSocketComponent.cpp | 0 .../Interactibles/VRButtonComponent.cpp | 0 .../Private/Interactibles/VRDialComponent.cpp | 4 +- .../VRInteractibleFunctionLibrary.cpp | 0 .../Interactibles/VRLeverComponent.cpp | 4 +- .../Interactibles/VRMountComponent.cpp | 4 +- .../Interactibles/VRSliderComponent.cpp | 4 +- .../Private/Misc/BucketUpdateSubsystem.cpp | 0 .../Private/Misc/CollisionIgnoreSubsystem.cpp | 0 .../Misc/OptionalRepSkeletalMeshActor.cpp | 0 .../Private/Misc/VRAIPerceptionOverrides.cpp | 0 .../Misc/VREPhysicalAnimationComponent.cpp | 0 .../Private/Misc/VRFullScreenUserWidget.cpp | 0 .../Private/Misc/VRGameViewportClient.cpp | 0 .../Private/Misc/VRLogComponent.cpp | 0 .../Private/Misc/VRPlayerStart.cpp | 0 .../Private/Misc/VRRenderTargetManager.cpp | 736 +++++++++++++++++- .../Private/Mover/VRMoverComponent.cpp | 2 +- .../ParentRelativeAttachmentComponent.cpp | 0 .../Private/ReplicatedVRCameraComponent.cpp | 0 ...FBPAdvGripPhysicsSettingsNetSerializer.cpp | 258 ++++++ .../FBPSecondaryGripInfoNetSerializer.cpp | 423 ++++++++++ .../FBPVRComponentPosRepNetSerializer.cpp | 277 +++++++ .../FRepMovementVRNetSerializer.cpp | 402 ++++++++++ .../FTransformNetQuantizeNetSerializer.cpp | 250 ++++++ .../Private/VRAIController.cpp | 0 .../Private/VRBPDatatypes.cpp | 0 .../Private/VRBaseCharacter.cpp | 449 ++++++++++- .../VRBaseCharacterMovementComponent.cpp | 0 .../VRExpansionPlugin/Private/VRCharacter.cpp | 0 .../Private/VRCharacterMovementComponent.cpp | 64 +- .../Private/VRExpansionFunctionLibrary.cpp | 0 .../Private/VRExpansionPlugin.cpp | 0 .../Private/VRExpansionPluginPrivatePCH.h | 0 .../Private/VRGestureComponent.cpp | 0 .../Private/VRGlobalSettings.cpp | 0 .../Private/VRGripInterface.cpp | 0 .../Private/VRPathFollowingComponent.cpp | 0 .../Private/VRPlayerController.cpp | 0 .../Private/VRRootComponent.cpp | 2 +- .../Private/VRStereoWidgetComponent.cpp | 11 +- .../Private/VRTrackedParentInterface.cpp | 0 .../Public/CharacterMovementCompTypes.h | 0 .../Public/GripMotionControllerComponent.h | 12 + .../Public/GripScripts/GS_Default.h | 0 .../Public/GripScripts/GS_GunTools.h | 0 .../GripScripts/GS_InteractibleSettings.h | 0 .../Public/GripScripts/GS_LerpToHand.h | 0 .../Public/GripScripts/GS_Melee.h | 0 .../Public/GripScripts/GS_Physics.h | 0 .../Public/GripScripts/VRGripScriptBase.h | 0 .../Public/Grippables/GrippableActor.h | 1 - .../Public/Grippables/GrippableBoxComponent.h | 0 .../Grippables/GrippableCapsuleComponent.h | 0 .../Public/Grippables/GrippableCharacter.h | 0 .../Public/Grippables/GrippableDataTypes.h | 6 +- .../Grippables/GrippablePhysicsReplication.h | 11 +- .../Grippables/GrippableSkeletalMeshActor.h | 2 +- .../GrippableSkeletalMeshComponent.h | 0 .../Grippables/GrippableSphereComponent.h | 0 .../Grippables/GrippableStaticMeshActor.h | 1 - .../Grippables/GrippableStaticMeshComponent.h | 0 .../Public/Grippables/HandSocketComponent.h | 0 .../Public/Interactibles/VRButtonComponent.h | 0 .../Public/Interactibles/VRDialComponent.h | 0 .../VRInteractibleFunctionLibrary.h | 0 .../Public/Interactibles/VRLeverComponent.h | 0 .../Public/Interactibles/VRMountComponent.h | 0 .../Public/Interactibles/VRSliderComponent.h | 0 .../Public/Misc/BucketUpdateSubsystem.h | 0 .../Public/Misc/CollisionIgnoreSubsystem.h | 0 .../Misc/OptionalRepSkeletalMeshActor.h | 0 .../Public/Misc/VRAIPerceptionOverrides.h | 0 .../Misc/VREPhysicalAnimationComponent.h | 0 .../Misc/VREPhysicsConstraintComponent.h | 0 .../Public/Misc/VRFullScreenUserWidget.h | 0 .../Public/Misc/VRGameViewportClient.h | 0 .../Public/Misc/VRLogComponent.h | 3 +- .../Public/Misc/VRPlayerStart.h | 0 .../Public/Misc/VRRenderTargetManager.h | 20 + .../Public/Misc/VRVehiclePawn.h | 0 .../Public/Misc/VRWheeledVehicle.h | 0 .../Public/Mover/VRMoverComponent.h | 2 +- .../ParentRelativeAttachmentComponent.h | 0 .../Public/ReplicatedVRCameraComponent.h | 0 .../FBPAdvGripPhysicsSettingsNetSerializer.h | 17 + .../FBPSecondaryGripInfoNetSerializer.h | 17 + .../FBPVRComponentPosRepNetSerializer.h | 17 + .../Serializers/FRepMovementVRNetSerializer.h | 17 + .../FTransformNetQuantizeNetSerializer.h | 26 + .../Public/Serializers/SerializerHelpers.h | 144 ++++ .../VRExpansionPlugin/Public/VRAIController.h | 0 .../VRExpansionPlugin/Public/VRBPDatatypes.h | 14 +- .../Public/VRBaseCharacter.h | 31 +- .../Public/VRBaseCharacterMovementComponent.h | 0 .../VRExpansionPlugin/Public/VRCharacter.h | 0 .../Public/VRCharacterMovementComponent.h | 0 .../Public/VRExpansionFunctionLibrary.h | 0 .../Public/VRExpansionPlugin.h | 0 .../Public/VRGestureComponent.h | 0 .../Public/VRGlobalSettings.h | 0 .../Public/VRGripInterface.h | 0 .../Public/VRPathFollowingComponent.h | 0 .../Public/VRPlayerController.h | 0 .../Public/VRRootComponent.h | 0 .../Public/VRStereoWidgetComponent.h | 0 .../Public/VRTrackedParentInterface.h | 0 .../VRExpansionPlugin.Build.cs | 0 .../VRExpansionPlugin.uplugin | 4 +- .../VRExpPluginExample.uproject | 2 +- 239 files changed, 3947 insertions(+), 296 deletions(-) delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitattributes delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitignore rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/AdvancedSessions.uplugin (94%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Config/FilterPlugin.ini (100%) delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/LICENSE.txt delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/README.md rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Resources/Icon128.png (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/AdvancedSessions.Build.cs (85%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedExternalUILibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h (86%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedFriendsInterface.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedFriendsLibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedGameSession.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedIdentityLibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedSessions.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h (97%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AdvancedVoiceLibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/AutoLoginUserCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/BlueprintDataDefinitions.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/CancelFindSessionsCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h (90%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/EndSessionCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/FindFriendSessionCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h (96%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/GetFriendsCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/GetRecentPlayersCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/GetUserPrivilegeCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/LoginUserCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/LogoutUserCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/OnlineSubSystemHeader.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/SendFriendInviteCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/StartSessionCallbackProxyAdvanced.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h (89%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedExternalUILibrary.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp (79%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedFriendsInterface.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedIdentityLibrary.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedSessions.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AdvancedVoiceLibrary.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/CancelFindSessionsCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp (94%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/EndSessionCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp (92%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp (94%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/GetFriendsCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/GetRecentPlayersCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/GetUserPrivilegeCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/LoginUserCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/LogoutUserCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/SendFriendInviteCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/StartSessionCallbackProxyAdvanced.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/{AdvancedSessions => }/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp (92%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/AdvancedSteamSessions.uplugin (90%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Config/FilterPlugin.ini (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Resources/Icon128.png (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs (85%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamSessions.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamWorkshopLibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h (70%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamRequestGroupOfficersCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamWSRequestUGCDetailsCallbackProxy.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp (93%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamSessions.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamWorkshopLibrary.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamRequestGroupOfficersCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{AdvancedSessions => }/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamWSRequestUGCDetailsCallbackProxy.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Config/FilterPlugin.ini (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin (95%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Resources/Icon128.png (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/OpenXRExpansionEditor.Build.cs (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/AnimGraphNode_ApplyOpenXRHandPose.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/OpenXRExpansionEditor.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/AnimGraphNode_ApplyOpenXRHandPose.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/OpenXRExpansionEditor.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/OpenXRExpansionPlugin.Build.cs (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/AnimNode_ApplyOpenXRHandPose.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp (86%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionPlugin.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRHandPoseComponent.cpp (100%) create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/Serializers/FBPXRSkeletalRepContainerNetSerializer.cpp rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/AnimNode_ApplyOpenXRHandPose.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h (94%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionPlugin.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/{VRExpansionPlugin => }/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRHandPoseComponent.h (100%) create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/Serializers/FBPXRSkeletalRepContainerNetSerializer.h delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitattributes delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitignore rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Config/FilterPlugin.ini (100%) delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/LICENSE.txt delete mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/README.md rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Resources/Icon128.png (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Private/HandSocketComponentDetails.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Private/HandSocketVisualizer.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Private/VRExpansionEditor.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Private/VRGlobalSettingsDetails.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Public/HandSocketComponentDetails.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Public/HandSocketVisualizer.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Public/VRExpansionEditor.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/Public/VRGlobalSettingsDetails.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionEditor/VRExpansionEditor.Build.cs (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/CharacterMovementCompTypes.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/GS_Default.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/GS_GunTools.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/GS_InteractibleSettings.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/GS_LerpToHand.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/GS_Melee.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/GS_Physics.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/GripScripts/VRGripScriptBase.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableCharacter.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp (84%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp (97%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Grippables/HandSocketComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Interactibles/VRButtonComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Interactibles/VRInteractibleFunctionLibrary.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/BucketUpdateSubsystem.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/CollisionIgnoreSubsystem.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/OptionalRepSkeletalMeshActor.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VRAIPerceptionOverrides.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VREPhysicalAnimationComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VRFullScreenUserWidget.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VRGameViewportClient.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VRLogComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VRPlayerStart.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp (65%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/ParentRelativeAttachmentComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/ReplicatedVRCameraComponent.cpp (100%) create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.cpp create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPSecondaryGripInfoNetSerializer.cpp create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPVRComponentPosRepNetSerializer.cpp create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FRepMovementVRNetSerializer.cpp create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FTransformNetQuantizeNetSerializer.cpp rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRAIController.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRBPDatatypes.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp (71%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRBaseCharacterMovementComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRCharacter.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRExpansionFunctionLibrary.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRExpansionPlugin.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRExpansionPluginPrivatePCH.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRGestureComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRGlobalSettings.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRGripInterface.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRPathFollowingComponent.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRPlayerController.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRRootComponent.cpp (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Private/VRTrackedParentInterface.cpp (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/CharacterMovementCompTypes.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/GS_Default.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/GS_GunTools.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/GS_InteractibleSettings.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/GS_LerpToHand.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/GS_Melee.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/GS_Physics.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/GripScripts/VRGripScriptBase.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableBoxComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableCapsuleComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableCharacter.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h (81%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h (96%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableSphereComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Grippables/HandSocketComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Interactibles/VRButtonComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Interactibles/VRDialComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Interactibles/VRInteractibleFunctionLibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Interactibles/VRLeverComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Interactibles/VRMountComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Interactibles/VRSliderComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/BucketUpdateSubsystem.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/CollisionIgnoreSubsystem.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/OptionalRepSkeletalMeshActor.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRAIPerceptionOverrides.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VREPhysicalAnimationComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VREPhysicsConstraintComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRFullScreenUserWidget.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRGameViewportClient.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRPlayerStart.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h (95%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRVehiclePawn.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Misc/VRWheeledVehicle.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/ParentRelativeAttachmentComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/ReplicatedVRCameraComponent.h (100%) create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.h create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPSecondaryGripInfoNetSerializer.h create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPVRComponentPosRepNetSerializer.h create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FRepMovementVRNetSerializer.h create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FTransformNetQuantizeNetSerializer.h create mode 100644 VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/SerializerHelpers.h rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRAIController.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRBPDatatypes.h (99%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRBaseCharacter.h (98%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRBaseCharacterMovementComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRCharacter.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRCharacterMovementComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRExpansionFunctionLibrary.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRExpansionPlugin.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRGestureComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRGlobalSettings.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRGripInterface.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRPathFollowingComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRPlayerController.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRRootComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRStereoWidgetComponent.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/Public/VRTrackedParentInterface.h (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/Source/VRExpansionPlugin/VRExpansionPlugin.Build.cs (100%) rename VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/{VRExpansionPlugin => }/VRExpansionPlugin.uplugin (95%) diff --git a/.gitmodules b/.gitmodules index 91cdba4..b3f2b0c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "VIRTUOS_ExpansionPluginTests/Plugins/StevesUEHelpers"] path = VIRTUOS_ExpansionPluginTests/Plugins/StevesUEHelpers url = https://github.com/sinbad/StevesUEHelpers +[submodule "VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin"] + path = VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin + url = https://github.com/mordentral/VRExpansionPlugin \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/.vsconfig b/VIRTUOS_ExpansionPluginTests/.vsconfig index 3b919ea..b981b2e 100644 --- a/VIRTUOS_ExpansionPluginTests/.vsconfig +++ b/VIRTUOS_ExpansionPluginTests/.vsconfig @@ -6,6 +6,8 @@ "Microsoft.Net.Component.4.6.2.TargetingPack", "Microsoft.VisualStudio.Component.VC.14.38.17.8.ATL", "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64", + "Microsoft.VisualStudio.Component.VC.14.44.17.14.ATL", + "Microsoft.VisualStudio.Component.VC.14.44.17.14.x86.x64", "Microsoft.VisualStudio.Component.VC.Llvm.Clang", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", "Microsoft.VisualStudio.Component.Windows11SDK.22621", diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitattributes b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitattributes deleted file mode 100644 index 3373152..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -* text=auto -*.bat eol=crlf \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitignore b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitignore deleted file mode 100644 index 3cdb673..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ - -.hg/ -binaries/ -deriveddatacache/ -.vs/ -build/ -intermediate/ -PACKPLUGIN/ -saved/ -*.orig \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/AdvancedSessions.uplugin b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions.uplugin similarity index 94% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/AdvancedSessions.uplugin rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions.uplugin index 7dc2e3a..6188c09 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/AdvancedSessions.uplugin +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions.uplugin @@ -1,8 +1,8 @@ { "FileVersion": 3, "FriendlyName": "Advanced Sessions", - "Version": 5.4, - "VersionName": "5.4", + "Version": 5.7, + "VersionName": "5.7", "Description": "Adds new blueprint functions to handle more advanced session operations.", "Category": "Advanced Sessions Plugin", "CreatedBy": "Joshua Statzer", diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Config/FilterPlugin.ini b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Config/FilterPlugin.ini similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Config/FilterPlugin.ini rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Config/FilterPlugin.ini diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/LICENSE.txt b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/LICENSE.txt deleted file mode 100644 index 986c999..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright Joshua Statzer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/README.md b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/README.md deleted file mode 100644 index c83724b..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/README.md +++ /dev/null @@ -1,7 +0,0 @@ -### How do I use it? ### - -**KantanDocGen Automatic Documentation ([KantanDocGen](http://kantandev.com/free/kantan-doc-gen))** - -**[AdvancedSessions](https://vreue4.com/generated-node-documentation?section=advanced-sessions-plugin)** - -**[AdvancedSteamSessions](https://vreue4.com/generated-node-documentation?section=advanced-steam-sessions-plugin)** diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Resources/Icon128.png b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Resources/Icon128.png similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Resources/Icon128.png rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Resources/Icon128.png diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/AdvancedSessions.Build.cs b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/AdvancedSessions.Build.cs similarity index 85% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/AdvancedSessions.Build.cs rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/AdvancedSessions.Build.cs index a305151..bb02018 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/AdvancedSessions.Build.cs +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/AdvancedSessions.Build.cs @@ -5,6 +5,9 @@ public class AdvancedSessions : ModuleRules { public AdvancedSessions(ReadOnlyTargetRules Target) : base(Target) { + DefaultBuildSettings = BuildSettingsVersion.Latest; + IncludeOrderVersion = EngineIncludeOrderVersion.Latest; + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; //bEnforceIWYU = true; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedExternalUILibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedExternalUILibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedExternalUILibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedExternalUILibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h similarity index 86% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h index be1def9..a0c0308 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h @@ -44,6 +44,16 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedVoiceInterface) bool bEnableTalkingStatusDelegate; + // If true we will auto join a session we have accepted in the overlay. + // This can get in the way of Beacon Sessions, you may want to disable it. + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface) + bool bAutoJoinSessionOnAcceptedUserInviteReceived = false; + + // If true we will auto travel to a game session when an invite is received. + // This can get in the way of Beacon Sessions, you may want to disable it. + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface) + bool bAutoTravelOnAcceptedUserInviteReceived = false; + //virtual void PostLoad() override; virtual void Shutdown() override; virtual void Init() override; @@ -52,6 +62,13 @@ public: FOnSessionInviteReceivedDelegate SessionInviteReceivedDelegate; FDelegateHandle SessionInviteReceivedDelegateHandle; + // custom handle to join directly from steam ui "Join Game" + FDelegateHandle OnJoinSessionCompleteDelegateHandle; + // custom Steam UI Join User function #Self invite# + void OnSessionUserInviteAccepted(const bool bWasSuccessful, const int32 ControllerId, FUniqueNetIdPtr UserId, const FOnlineSessionSearchResult& InviteResult); + // custom Steam UI function to client travel #Self invite# + void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result); + //const FUniqueNetId& /*UserId*/, const FUniqueNetId& /*FromId*/, const FString& /*AppId*/, const FOnlineSessionSearchResult& /*InviteResult*/ void OnSessionInviteReceivedMaster(const FUniqueNetId & PersonInvited, const FUniqueNetId & PersonInviting, const FString & AppId, const FOnlineSessionSearchResult& SessionToJoin); diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsInterface.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsInterface.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsInterface.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsInterface.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsLibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsLibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedGameSession.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedGameSession.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedGameSession.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedGameSession.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedIdentityLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedIdentityLibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedIdentityLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedIdentityLibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessions.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessions.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessions.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessions.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h similarity index 97% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h index 457bcdd..d7c53c2 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedSessionsLibrary.h @@ -160,6 +160,10 @@ public: UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID") static void GetUniqueNetID(APlayerController *PlayerController, FBPUniqueNetId &UniqueNetId); + // Get the unique net id of a network player attached to the given controller + UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID") + static void GetUniqueNetIdOfSessionOwner(FBlueprintSessionResult SessionResult, FBPUniqueNetId& UniqueNetId); + // Get the unique net id of a network player who is assigned the the given player state UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID") static void GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId); diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedVoiceLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedVoiceLibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedVoiceLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedVoiceLibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AutoLoginUserCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AutoLoginUserCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/AutoLoginUserCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AutoLoginUserCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/BlueprintDataDefinitions.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/BlueprintDataDefinitions.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/BlueprintDataDefinitions.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/BlueprintDataDefinitions.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/CancelFindSessionsCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/CancelFindSessionsCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/CancelFindSessionsCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/CancelFindSessionsCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h similarity index 90% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h index 04ae6d1..448c587 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/CreateSessionCallbackProxyAdvanced.h @@ -23,14 +23,14 @@ class UCreateSessionCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase * Creates a session with the default online subsystem with advanced optional inputs, for dedicated servers leave UsePresence as false and set IsDedicatedServer to true. Dedicated servers don't use presence. * @param PublicConnections When doing a 'listen' server, this must be >=2 (ListenServer itself counts as a connection) * @param bUseLAN When you want to play LAN, the level to play on must be loaded with option 'bIsLanMatch' - * @param bUsePresence Must be true for a 'listen' server (Map must be loaded with option 'listen'), false for a 'dedicated' server. * @param bUseLobbiesIfAvailable Used to flag the subsystem to use a lobby api instead of general hosting if the API supports it, generally true on steam for listen servers and false for dedicated + * Must be true for a 'listen' server (Map must be loaded with option 'listen'), false for a 'dedicated' server. * @param bShouldAdvertise Set to true when the OnlineSubsystem should list your server when someone is searching for servers. Otherwise the server is hidden and only join via invite is possible. * @param bUseLobbiesVoiceChatIfAvailable Set to true to setup voice chat lobbies if the API supports it * @param bStartAfterCreate Set to true to start the session after it's created. If false you need to manually call StartSession when ready. */ UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject",AutoCreateRefTerm="ExtraSettings"), Category = "Online|AdvancedSessions") - static UCreateSessionCallbackProxyAdvanced* CreateAdvancedSession(UObject* WorldContextObject, const TArray& ExtraSettings, class APlayerController* PlayerController = NULL, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = true, bool bIsDedicatedServer = false, bool bUsePresence = true, bool bUseLobbiesIfAvailable = true, bool bAllowJoinViaPresence = true, bool bAllowJoinViaPresenceFriendsOnly = false, bool bAntiCheatProtected = false, bool bUsesStats = false, bool bShouldAdvertise = true, bool bUseLobbiesVoiceChatIfAvailable = false, bool bStartAfterCreate = true); + static UCreateSessionCallbackProxyAdvanced* CreateAdvancedSession(UObject* WorldContextObject, const TArray& ExtraSettings, class APlayerController* PlayerController = NULL, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = true, bool bIsDedicatedServer = false, /*bool bUsePresence = true,*/ bool bUseLobbiesIfAvailable = true, bool bAllowJoinViaPresence = true, bool bAllowJoinViaPresenceFriendsOnly = false, bool bAntiCheatProtected = false, bool bUsesStats = false, bool bShouldAdvertise = true, bool bUseLobbiesVoiceChatIfAvailable = false, bool bStartAfterCreate = true); // UOnlineBlueprintCallProxyBase interface virtual void Activate() override; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/EndSessionCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/EndSessionCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/EndSessionCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/EndSessionCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/FindFriendSessionCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindFriendSessionCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/FindFriendSessionCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindFriendSessionCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h similarity index 96% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h index e610277..5d225d8 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h @@ -28,7 +28,7 @@ class UFindSessionsCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase // Searches for advertised sessions with the default online subsystem and includes an array of filters UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", AutoCreateRefTerm="Filters"), Category = "Online|AdvancedSessions") - static UFindSessionsCallbackProxyAdvanced* FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int32 MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly = false, bool bNonEmptyServersOnly = false, bool bSecureServersOnly = false, bool bSearchLobbies = true, int MinSlotsAvailable = 0); + static UFindSessionsCallbackProxyAdvanced* FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int32 MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly = false, bool bNonEmptyServersOnly = false, bool bSecureServersOnly = false, /*bool bSearchLobbies = true,*/ int MinSlotsAvailable = 0); static bool CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator); @@ -99,7 +99,7 @@ private: bool bSecureServersOnly; // Search through lobbies - bool bSearchLobbies; + //bool bSearchLobbies; // Min slots requires to search int MinSlotsAvailable; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/GetFriendsCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/GetFriendsCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/GetFriendsCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/GetFriendsCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/GetRecentPlayersCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/GetRecentPlayersCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/GetRecentPlayersCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/GetRecentPlayersCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/GetUserPrivilegeCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/GetUserPrivilegeCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/GetUserPrivilegeCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/GetUserPrivilegeCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/LoginUserCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/LoginUserCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/LoginUserCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/LoginUserCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/LogoutUserCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/LogoutUserCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/LogoutUserCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/LogoutUserCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/OnlineSubSystemHeader.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/OnlineSubSystemHeader.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/OnlineSubSystemHeader.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/OnlineSubSystemHeader.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/SendFriendInviteCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/SendFriendInviteCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/SendFriendInviteCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/SendFriendInviteCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/StartSessionCallbackProxyAdvanced.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/StartSessionCallbackProxyAdvanced.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/StartSessionCallbackProxyAdvanced.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/StartSessionCallbackProxyAdvanced.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h similarity index 89% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h index afdc181..b45ccf3 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/UpdateSessionCallbackProxyAdvanced.h @@ -21,7 +21,7 @@ class UUpdateSessionCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase // Creates a session with the default online subsystem with advanced optional inputs, you MUST fill in all categories or it will pass in values that you didn't want as default values UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject",AutoCreateRefTerm="ExtraSettings"), Category = "Online|AdvancedSessions") - static UUpdateSessionCallbackProxyAdvanced* UpdateSession(UObject* WorldContextObject, const TArray &ExtraSettings, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = false, bool bAllowJoinInProgress = false, bool bRefreshOnlineData = true, bool bIsDedicatedServer = false, bool bShouldAdvertise = true); + static UUpdateSessionCallbackProxyAdvanced* UpdateSession(UObject* WorldContextObject, const TArray &ExtraSettings, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = false, bool bAllowJoinInProgress = false, bool bRefreshOnlineData = true, bool bIsDedicatedServer = false, bool bShouldAdvertise = true, bool bAllowJoinViaPresence = true, bool bAllowJoinViaPresenceFriendsOnly = false); // UOnlineBlueprintCallProxyBase interface virtual void Activate() override; @@ -58,6 +58,12 @@ private: // Allow joining in progress bool bAllowJoinInProgress = true; + // Allow joining in progress + bool bAllowJoinViaPresence = true; + + // Allow joining in progress + bool bAllowJoinViaPresenceFriendsOnly = false; + // Update whether this is a dedicated server or not bool bDedicatedServer = false; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedExternalUILibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedExternalUILibrary.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedExternalUILibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedExternalUILibrary.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp similarity index 79% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp index 47afb6a..8ca29ee 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp @@ -20,6 +20,61 @@ UAdvancedFriendsGameInstance::UAdvancedFriendsGameInstance(const FObjectInitiali { } +void UAdvancedFriendsGameInstance::OnSessionUserInviteAccepted(const bool bWasSuccessful, const int32 ControllerId, FUniqueNetIdPtr UserId, const FOnlineSessionSearchResult& InviteResult) +{ + if (!bAutoJoinSessionOnAcceptedUserInviteReceived) + return; + + IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); + if (SessionInterface.IsValid()) + { + // Eventually call this?, would need another call back to run through + //SessionInterface->DestroySession(NAME_GameSession); + + SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle); + OnJoinSessionCompleteDelegateHandle = SessionInterface->AddOnJoinSessionCompleteDelegate_Handle( + FOnJoinSessionCompleteDelegate::CreateUObject(this, &UAdvancedFriendsGameInstance::OnJoinSessionComplete)); + + // Temp for 5.5, they aren't filling in the struct correctly + if (!InviteResult.Session.SessionSettings.bIsDedicated) + { + FOnlineSessionSearchResult ModResult = InviteResult; + ModResult.Session.SessionSettings.bUsesPresence = true; + ModResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; + SessionInterface->JoinSession(0, NAME_GameSession, ModResult); + } + else + { + SessionInterface->JoinSession(0, NAME_GameSession, InviteResult); + } + } + UE_LOG(AdvancedFriendsInterfaceLog, Log, TEXT("Called Join Session for Steam Friends List UI InviteResults: %s, UserId: %s"), *InviteResult.GetSessionIdStr(), *UserId->ToString()); +} + +void UAdvancedFriendsGameInstance::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result) +{ + + // If we don't want to auto travel to the session instance then exit out + if (!bAutoTravelOnAcceptedUserInviteReceived) + { + return; + } + + IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); + if (SessionInterface.IsValid()) + { + FString ConnectInfo; + if (SessionInterface->GetResolvedConnectString(NAME_GameSession, ConnectInfo)) + { + APlayerController* PlayerController = GetFirstLocalPlayerController(); + if (PlayerController) + { + PlayerController->ClientTravel(ConnectInfo, ETravelType::TRAVEL_Absolute); + } + } + } +} + void UAdvancedFriendsGameInstance::Shutdown() { IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); @@ -34,6 +89,7 @@ void UAdvancedFriendsGameInstance::Shutdown() // Clear all of the delegate handles here SessionInterface->ClearOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegateHandle); SessionInterface->ClearOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegateHandle); + SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle); } @@ -80,6 +136,9 @@ void UAdvancedFriendsGameInstance::Init() SessionInviteAcceptedDelegateHandle = SessionInterface->AddOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegate); SessionInviteReceivedDelegateHandle = SessionInterface->AddOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegate); + + // Custom steam join game delegate + SessionInterface->OnSessionUserInviteAcceptedDelegates.AddUObject(this, &UAdvancedFriendsGameInstance::OnSessionUserInviteAccepted); } else { @@ -271,6 +330,13 @@ void UAdvancedFriendsGameInstance::OnSessionInviteReceivedMaster(const FUniqueNe } } + // Temp for 5.5, they aren't filling in the struct correctly + if (!BluePrintResult.OnlineResult.Session.SessionSettings.bIsDedicated) + { + BluePrintResult.OnlineResult.Session.SessionSettings.bUsesPresence = true; + BluePrintResult.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; + } + OnSessionInviteReceived(LocalPlayer, PInviting, AppId, BluePrintResult); //IAdvancedFriendsInterface* TheInterface = NULL; @@ -307,6 +373,13 @@ void UAdvancedFriendsGameInstance::OnSessionInviteAcceptedMaster(const bool bWas FBPUniqueNetId PInvited; PInvited.SetUniqueNetId(PersonInvited); + // Temp for 5.5, they aren't filling in the struct correctly + if (!BluePrintResult.OnlineResult.Session.SessionSettings.bIsDedicated) + { + BluePrintResult.OnlineResult.Session.SessionSettings.bUsesPresence = true; + BluePrintResult.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; + } + OnSessionInviteAccepted(LocalPlayer,PInvited, BluePrintResult); APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), LocalPlayer); diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsInterface.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsInterface.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsInterface.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsInterface.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp index 5df1a94..6bb7eac 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsLibrary.cpp @@ -151,7 +151,9 @@ void UAdvancedFriendsLibrary::GetFriend(APlayerController *PlayerController, con Friend.PresenceInfo.bIsPlaying = pres.bIsPlaying; Friend.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame; Friend.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); + // #TODO: Check back in on this in shipping, epic is missing the UTF8_TO_TCHAR call on converting this and its making an invalid string + // OnlineFriendPresenceInterfaceSteam has the issue //Friend.PresenceInfo.StatusString = pres.Status.StatusStr; } } @@ -266,6 +268,7 @@ void UAdvancedFriendsLibrary::GetStoredFriendsList(APlayerController *PlayerCont BPF.PresenceInfo.bIsPlaying = pres.bIsPlaying; BPF.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); // #TODO: Check back in on this in shipping, epic is missing the UTF8_TO_TCHAR call on converting this and its making an invalid string + // OnlineFriendPresenceInterfaceSteam has the issue //BPF.PresenceInfo.StatusString = pres.Status.StatusStr; BPF.PresenceInfo.bIsJoinable = pres.bIsJoinable; BPF.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedIdentityLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedIdentityLibrary.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedIdentityLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedIdentityLibrary.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessions.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessions.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessions.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessions.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp index a5453d1..dfb6fd7 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedSessionsLibrary.cpp @@ -451,6 +451,17 @@ void UAdvancedSessionsLibrary::GetUniqueNetID(APlayerController *PlayerControlle } } +void UAdvancedSessionsLibrary::GetUniqueNetIdOfSessionOwner(FBlueprintSessionResult SessionResult, FBPUniqueNetId& UniqueNetId) +{ + FBPUniqueNetId ReturnID; + if (SessionResult.OnlineResult.IsValid()) + { + ReturnID.SetUniqueNetId(SessionResult.OnlineResult.Session.OwningUserId); + } + + UniqueNetId = ReturnID; +} + void UAdvancedSessionsLibrary::GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId) { if (!PlayerState) diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedVoiceLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedVoiceLibrary.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedVoiceLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedVoiceLibrary.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp index 9046773..d61f902 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AutoLoginUserCallbackProxy.cpp @@ -83,6 +83,8 @@ void UAutoLoginUserCallbackProxy::OnCompleted(int32 LocalUserNum, bool bWasSucce { OnFailure.Broadcast(); } + + return; } OnFailure.Broadcast(); diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/CancelFindSessionsCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/CancelFindSessionsCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/CancelFindSessionsCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/CancelFindSessionsCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp similarity index 94% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp index 1ff10c1..6b07bf1 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/CreateSessionCallbackProxyAdvanced.cpp @@ -13,7 +13,7 @@ UCreateSessionCallbackProxyAdvanced::UCreateSessionCallbackProxyAdvanced(const F { } -UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::CreateAdvancedSession(UObject* WorldContextObject, const TArray& ExtraSettings, class APlayerController* PlayerController, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bIsDedicatedServer, bool bUsePresence, bool bUseLobbiesIfAvailable, bool bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly, bool bAntiCheatProtected, bool bUsesStats, bool bShouldAdvertise, bool bUseLobbiesVoiceChatIfAvailable, bool bStartAfterCreate) +UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::CreateAdvancedSession(UObject* WorldContextObject, const TArray& ExtraSettings, class APlayerController* PlayerController, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bIsDedicatedServer, /*bool bUsePresence,*/ bool bUseLobbiesIfAvailable, bool bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly, bool bAntiCheatProtected, bool bUsesStats, bool bShouldAdvertise, bool bUseLobbiesVoiceChatIfAvailable, bool bStartAfterCreate) { UCreateSessionCallbackProxyAdvanced* Proxy = NewObject(); Proxy->PlayerControllerWeakPtr = PlayerController; @@ -24,7 +24,7 @@ UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::Create Proxy->bAllowInvites = bAllowInvites; Proxy->ExtraSettings = ExtraSettings; Proxy->bDedicatedServer = bIsDedicatedServer; - Proxy->bUsePresence = bUsePresence; + /*Proxy->bUsePresence = bUsePresence;*/ Proxy->bUseLobbiesIfAvailable = bUseLobbiesIfAvailable; Proxy->bAllowJoinViaPresence = bAllowJoinViaPresence; Proxy->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly; @@ -61,13 +61,13 @@ void UCreateSessionCallbackProxyAdvanced::Activate() if (bDedicatedServer) { - Settings.bUsesPresence = false; Settings.bUseLobbiesIfAvailable = false; + Settings.bUsesPresence = false; } else { - Settings.bUsesPresence = bUsePresence; Settings.bUseLobbiesIfAvailable = bUseLobbiesIfAvailable; + Settings.bUsesPresence = bUseLobbiesIfAvailable; } Settings.bUseLobbiesVoiceChatIfAvailable = bUseLobbiesIfAvailable ? bUseLobbiesVoiceChatIfAvailable : false; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/EndSessionCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/EndSessionCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/EndSessionCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/EndSessionCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp similarity index 92% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp index 019255c..719bed9 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindFriendSessionCallbackProxy.cpp @@ -102,6 +102,14 @@ void UFindFriendSessionCallbackProxy::OnFindFriendSessionCompleted(int32 LocalPl { FBlueprintSessionResult BSesh; BSesh.OnlineResult = Sesh; + + // Temp for 5.5, force the values if epic isn't setting them, lobbies should always have these true + if (!BSesh.OnlineResult.Session.SessionSettings.bIsDedicated) + { + BSesh.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; + BSesh.OnlineResult.Session.SessionSettings.bUsesPresence = true; + } + Result.Add(BSesh); } } diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp similarity index 94% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp index dc0dc4b..e031688 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp @@ -16,7 +16,7 @@ UFindSessionsCallbackProxyAdvanced::UFindSessionsCallbackProxyAdvanced(const FOb bIsOnSecondSearch = false; } -UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly, bool bNonEmptyServersOnly, bool bSecureServersOnly, bool bSearchLobbies, int MinSlotsAvailable) +UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly, bool bNonEmptyServersOnly, bool bSecureServersOnly, /*bool bSearchLobbies,*/ int MinSlotsAvailable) { UFindSessionsCallbackProxyAdvanced* Proxy = NewObject(); Proxy->PlayerControllerWeakPtr = PlayerController; @@ -28,7 +28,7 @@ UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSess Proxy->bEmptyServersOnly = bEmptyServersOnly, Proxy->bNonEmptyServersOnly = bNonEmptyServersOnly; Proxy->bSecureServersOnly = bSecureServersOnly; - Proxy->bSearchLobbies = bSearchLobbies; + //Proxy->bSearchLobbies = bSearchLobbies; Proxy->MinSlotsAvailable = MinSlotsAvailable; return Proxy; } @@ -86,7 +86,6 @@ void UFindSessionsCallbackProxyAdvanced::Activate() /** #define SEARCH_SWITCH_SELECTION_METHOD FName(TEXT("SWITCHSELECTIONMETHOD"))*/ /** Whether to use lobbies vs sessions */ /** #define SEARCH_LOBBIES FName(TEXT("LOBBYSEARCH"))*/ - if (bEmptyServersOnly) tem.Set(SEARCH_EMPTY_SERVERS_ONLY, true, EOnlineComparisonOp::Equals); @@ -114,9 +113,9 @@ void UFindSessionsCallbackProxyAdvanced::Activate() case EBPServerPresenceSearchType::ClientServersOnly: { - tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); + //tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); - if (bSearchLobbies && !IOnlineSubsystem::DoesInstanceExist("STEAM")) + //if (bSearchLobbies)// && !IOnlineSubsystem::DoesInstanceExist("STEAM")) tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals); } break; @@ -140,9 +139,9 @@ void UFindSessionsCallbackProxyAdvanced::Activate() FOnlineSearchSettingsEx DedicatedOnly = tem; - tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); + //tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); - if (bSearchLobbies && !IOnlineSubsystem::DoesInstanceExist("STEAM")) + //if (bSearchLobbies)// && !IOnlineSubsystem::DoesInstanceExist("STEAM")) tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals); //DedicatedOnly.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals); @@ -225,6 +224,14 @@ void UFindSessionsCallbackProxyAdvanced::OnCompleted(bool bSuccess) FBlueprintSessionResult BPResult; BPResult.OnlineResult = Result; + + // Temp for 5.5, force the values if epic isn't setting them, lobbies should always have these true + if (ServerSearchType != EBPServerPresenceSearchType::DedicatedServersOnly ) + { + BPResult.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; + BPResult.OnlineResult.Session.SessionSettings.bUsesPresence = true; + } + SessionSearchResults.AddUnique(BPResult); } if (!bRunSecondSearch) diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/GetFriendsCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/GetFriendsCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/GetFriendsCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/GetFriendsCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/GetRecentPlayersCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/GetRecentPlayersCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/GetRecentPlayersCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/GetRecentPlayersCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/GetUserPrivilegeCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/GetUserPrivilegeCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/GetUserPrivilegeCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/GetUserPrivilegeCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/LoginUserCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/LoginUserCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/LoginUserCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/LoginUserCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/LogoutUserCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/LogoutUserCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/LogoutUserCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/LogoutUserCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/SendFriendInviteCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/SendFriendInviteCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/SendFriendInviteCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/SendFriendInviteCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/StartSessionCallbackProxyAdvanced.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/StartSessionCallbackProxyAdvanced.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/StartSessionCallbackProxyAdvanced.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/StartSessionCallbackProxyAdvanced.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp similarity index 92% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp index 31aa9d9..c105aa6 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSessions/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/UpdateSessionCallbackProxyAdvanced.cpp @@ -12,7 +12,7 @@ UUpdateSessionCallbackProxyAdvanced::UUpdateSessionCallbackProxyAdvanced(const F { } -UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::UpdateSession(UObject* WorldContextObject, const TArray &ExtraSettings, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bAllowJoinInProgress, bool bRefreshOnlineData, bool bIsDedicatedServer, bool bShouldAdvertise) +UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::UpdateSession(UObject* WorldContextObject, const TArray &ExtraSettings, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bAllowJoinInProgress, bool bRefreshOnlineData, bool bIsDedicatedServer, bool bShouldAdvertise, bool bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly) { UUpdateSessionCallbackProxyAdvanced* Proxy = NewObject(); Proxy->NumPublicConnections = PublicConnections; @@ -25,6 +25,8 @@ UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::Update Proxy->bAllowJoinInProgress = bAllowJoinInProgress; Proxy->bDedicatedServer = bIsDedicatedServer; Proxy->bShouldAdvertise = bShouldAdvertise; + Proxy->bAllowJoinViaPresence = bAllowJoinViaPresence; + Proxy->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly; return Proxy; } @@ -65,11 +67,14 @@ void UUpdateSessionCallbackProxyAdvanced::Activate() Settings->bAllowJoinInProgress = bAllowJoinInProgress; Settings->bIsLANMatch = bUseLAN; //Settings->bUsesPresence = true; - //Settings->bAllowJoinViaPresence = true; Settings->bAllowInvites = bAllowInvites; Settings->bAllowJoinInProgress = bAllowJoinInProgress; Settings->bIsDedicated = bDedicatedServer; + // Added in 5.6 + Settings->bAllowJoinViaPresence = bAllowJoinViaPresence; + Settings->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly; + FOnlineSessionSetting * fSetting = NULL; FOnlineSessionSetting ExtraSetting; for (int i = 0; i < ExtraSettings.Num(); i++) diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/AdvancedSteamSessions.uplugin b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/AdvancedSteamSessions.uplugin similarity index 90% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/AdvancedSteamSessions.uplugin rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/AdvancedSteamSessions.uplugin index 307c51e..71adae0 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/AdvancedSteamSessions.uplugin +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/AdvancedSteamSessions.uplugin @@ -2,8 +2,8 @@ "FileVersion" : 3, "FriendlyName" : "Advanced Steam Sessions", - "Version" : 5.4, - "VersionName": "5.4", + "Version" : 5.7, + "VersionName": "5.7", "Description" : "Adds new blueprint functions to handle more advanced session operations in Steam. REQUIRES ADVANCED SESSIONS", "Category" : "Advanced Sessions Plugin", "CreatedBy" : "Joshua Statzer", @@ -14,7 +14,7 @@ { "Name": "AdvancedSteamSessions", "Type": "RunTime", - "LoadingPhase": "Default" + "LoadingPhase": "PostDefault" } ], "Plugins": [ diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Config/FilterPlugin.ini b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Config/FilterPlugin.ini similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Config/FilterPlugin.ini rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Config/FilterPlugin.ini diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Resources/Icon128.png b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Resources/Icon128.png similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Resources/Icon128.png rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Resources/Icon128.png diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs similarity index 85% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs index 6a4c768..db55501 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/AdvancedSteamSessions.Build.cs @@ -5,6 +5,9 @@ public class AdvancedSteamSessions : ModuleRules { public AdvancedSteamSessions(ReadOnlyTargetRules Target) : base(Target) { + DefaultBuildSettings = BuildSettingsVersion.Latest; + IncludeOrderVersion = EngineIncludeOrderVersion.Latest; + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; //bEnforceIWYU = true; @@ -16,6 +19,7 @@ public class AdvancedSteamSessions : ModuleRules if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Linux) || (Target.Platform == UnrealTargetPlatform.Mac)) { PublicDependencyModuleNames.AddRange(new string[] { "SteamShared", "Steamworks", "OnlineSubsystemSteam" }); + AddEngineThirdPartyPrivateStaticDependencies(Target, "Steamworks"); //PublicIncludePaths.AddRange(new string[] { "../Plugins/Online/OnlineSubsystemSteam/Source/Private" });// This is dumb but it isn't very open } } diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h index 83de461..a0a7b8e 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamFriendsLibrary.h @@ -42,7 +42,7 @@ MSVC_PRAGMA(warning(pop)) #endif // USING_CODE_ANALYSIS #include -#include +//#include //#include #pragma pop_macro("ARRAY_COUNT") @@ -337,8 +337,8 @@ public: static bool RequestSteamFriendInfo(const FBPUniqueNetId UniqueNetId, bool bRequireNameOnly = false); // Opens the steam overlay to go to the specified user dialog - UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI") - static bool OpenSteamUserOverlay(const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType); + UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI", meta = (WorldContext = "WorldContextObject")) + static bool OpenSteamUserOverlay(UObject* WorldContextObject, const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType); // Returns if the steam overlay is currently active (this can return false during initial overlay hooking) UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI") diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamSessions.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamSessions.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamSessions.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamSessions.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamWorkshopLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamWorkshopLibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamWorkshopLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/AdvancedSteamWorkshopLibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h similarity index 70% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h index 7b8641a..7b6948c 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamNotificationsSubsystem.h @@ -38,14 +38,27 @@ public: void Initialize(USteamNotificationsSubsystem* MyParent) { ParentSubsystem = MyParent; + +#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED + OnExternalUITriggeredCallback.Register(this, &USteamNotificationsSubsystem::cSteamEventsStore::OnExternalUITriggered); +#endif + } + + void UnInitialize(USteamNotificationsSubsystem* MyParent) + { +#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED + OnExternalUITriggeredCallback.Unregister(); +#endif } #if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED - cSteamEventsStore() : - OnExternalUITriggeredCallback(this, &cSteamEventsStore::OnExternalUITriggered) + cSteamEventsStore() + {} + //: + /*OnExternalUITriggeredCallback(this, &cSteamEventsStore::OnExternalUITriggered) { - } + }*/ #else //cSteamEventsStore() //{ @@ -57,7 +70,8 @@ public: private: #if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED - STEAM_CALLBACK(cSteamEventsStore, OnExternalUITriggered, GameOverlayActivated_t, OnExternalUITriggeredCallback); + //STEAM_CALLBACK(cSteamEventsStore, OnExternalUITriggered, GameOverlayActivated_t, OnExternalUITriggeredCallback); + STEAM_CALLBACK_MANUAL(cSteamEventsStore, OnExternalUITriggered, GameOverlayActivated_t, OnExternalUITriggeredCallback); #endif }; @@ -72,7 +86,7 @@ public: /** Implement this for deinitialization of instances of the system */ virtual void Deinitialize() override { - + MyEvents.UnInitialize(this); } }; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamRequestGroupOfficersCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamRequestGroupOfficersCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamRequestGroupOfficersCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamRequestGroupOfficersCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamWSRequestUGCDetailsCallbackProxy.h b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamWSRequestUGCDetailsCallbackProxy.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamWSRequestUGCDetailsCallbackProxy.h rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Classes/SteamWSRequestUGCDetailsCallbackProxy.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp similarity index 93% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp index 85340e4..ea38621 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamFriendsLibrary.cpp @@ -1,6 +1,11 @@ // Fill out your copyright notice in the Description page of Project Settings. #include "AdvancedSteamFriendsLibrary.h" #include "OnlineSubSystemHeader.h" +#include "OnlineSubsystemTypes.h" +#include "Engine/Texture.h" +#include "Engine/Texture2D.h" +#include "TextureResource.h" +#include "PixelFormat.h" //General Log DEFINE_LOG_CATEGORY(AdvancedSteamFriendsLog); @@ -233,7 +238,7 @@ bool UAdvancedSteamFriendsLibrary::RequestSteamFriendInfo(const FBPUniqueNetId U } -bool UAdvancedSteamFriendsLibrary::OpenSteamUserOverlay(const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType) +bool UAdvancedSteamFriendsLibrary::OpenSteamUserOverlay(UObject* WorldContextObject,const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType) { #if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM) @@ -244,13 +249,24 @@ bool UAdvancedSteamFriendsLibrary::OpenSteamUserOverlay(const FBPUniqueNetId Uni if (SteamAPI_Init()) { - uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes()); if (DialogType == ESteamUserOverlayType::invitetolobby) { - SteamFriends()->ActivateGameOverlayInviteDialog(id); + UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); + IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(World); + if (SessionInterface.IsValid()) + { + FNamedOnlineSession* CurrentSession = SessionInterface->GetNamedSession(NAME_GameSession); + + if (CurrentSession && CurrentSession->SessionInfo->GetSessionId().IsValid()) + { + uint64 id = *((uint64*)CurrentSession->SessionInfo->GetSessionId().GetBytes()); + SteamFriends()->ActivateGameOverlayInviteDialog(id); + } + } } else { + uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes()); FString DialogName = EnumToString("ESteamUserOverlayType", (uint8)DialogType); SteamFriends()->ActivateGameOverlayToUser(TCHAR_TO_ANSI(*DialogName), id); } diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamSessions.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamSessions.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamSessions.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamSessions.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamWorkshopLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamWorkshopLibrary.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamWorkshopLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/AdvancedSteamWorkshopLibrary.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamRequestGroupOfficersCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamRequestGroupOfficersCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamRequestGroupOfficersCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamRequestGroupOfficersCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamWSRequestUGCDetailsCallbackProxy.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamWSRequestUGCDetailsCallbackProxy.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSessions/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamWSRequestUGCDetailsCallbackProxy.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/AdvancedSteamSessions/Source/AdvancedSteamSessions/Private/SteamWSRequestUGCDetailsCallbackProxy.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Config/FilterPlugin.ini b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Config/FilterPlugin.ini similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Config/FilterPlugin.ini rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Config/FilterPlugin.ini diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin similarity index 95% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin index f04ed51..2fa6a31 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin +++ b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/OpenXRExpansionPlugin.uplugin @@ -1,7 +1,7 @@ { "FileVersion": 3, - "Version": 5.5, - "VersionName": "5.5", + "Version": 5.7, + "VersionName": "5.7", "FriendlyName": "OpenXRExpansionPlugin", "Description": "An set of utility functions for OpenXR", "Category": "Virtual Reality", diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Resources/Icon128.png b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Resources/Icon128.png similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Resources/Icon128.png rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Resources/Icon128.png diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/OpenXRExpansionEditor.Build.cs b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/OpenXRExpansionEditor.Build.cs similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/OpenXRExpansionEditor.Build.cs rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/OpenXRExpansionEditor.Build.cs diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/AnimGraphNode_ApplyOpenXRHandPose.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/AnimGraphNode_ApplyOpenXRHandPose.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/AnimGraphNode_ApplyOpenXRHandPose.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/AnimGraphNode_ApplyOpenXRHandPose.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/OpenXRExpansionEditor.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/OpenXRExpansionEditor.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/OpenXRExpansionEditor.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Private/OpenXRExpansionEditor.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/AnimGraphNode_ApplyOpenXRHandPose.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/AnimGraphNode_ApplyOpenXRHandPose.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/AnimGraphNode_ApplyOpenXRHandPose.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/AnimGraphNode_ApplyOpenXRHandPose.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/OpenXRExpansionEditor.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/OpenXRExpansionEditor.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/OpenXRExpansionEditor.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionEditor/Public/OpenXRExpansionEditor.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/OpenXRExpansionPlugin.Build.cs b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/OpenXRExpansionPlugin.Build.cs similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/OpenXRExpansionPlugin.Build.cs rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/OpenXRExpansionPlugin.Build.cs diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/AnimNode_ApplyOpenXRHandPose.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/AnimNode_ApplyOpenXRHandPose.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/AnimNode_ApplyOpenXRHandPose.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/AnimNode_ApplyOpenXRHandPose.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp similarity index 86% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp index 89c9aa1..604cf71 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionFunctionLibrary.cpp @@ -163,34 +163,40 @@ void UOpenXRExpansionFunctionLibrary::GetXRMotionControllerType(FString& Trackin bool UOpenXRExpansionFunctionLibrary::GetOpenXRHandPose(FBPOpenXRActionSkeletalData& HandPoseContainer, UOpenXRHandPoseComponent* HandPoseComponent, bool bGetMockUpPose) { - FXRMotionControllerData MotionControllerData; + FXRHandTrackingState HandTrackingData; + FXRMotionControllerState MotionControllerData; if (bGetMockUpPose) { - GetMockUpControllerData(MotionControllerData, HandPoseContainer); + // #TODO 5.7 TEST THIS + UHeadMountedDisplayFunctionLibrary::GetMotionControllerState((UObject*)HandPoseComponent, EXRSpaceType::UnrealWorldSpace, HandPoseContainer.TargetHand == EVRSkeletalHandIndex::EActionHandIndex_Left ? EControllerHand::Left : EControllerHand::Right, HandPoseContainer.PoseType, MotionControllerData); + GetMockUpControllerData(HandTrackingData,MotionControllerData, HandPoseContainer); return true; } - UHeadMountedDisplayFunctionLibrary::GetMotionControllerData((UObject*)HandPoseComponent, HandPoseContainer.TargetHand == EVRSkeletalHandIndex::EActionHandIndex_Left ? EControllerHand::Left : EControllerHand::Right, MotionControllerData); + UHeadMountedDisplayFunctionLibrary::GetHandTrackingState((UObject*)HandPoseComponent, EXRSpaceType::UnrealWorldSpace, HandPoseContainer.TargetHand == EVRSkeletalHandIndex::EActionHandIndex_Left ? EControllerHand::Left : EControllerHand::Right, HandTrackingData); - if (MotionControllerData.bValid) + if (HandTrackingData.bValid) { - HandPoseContainer.SkeletalTransforms.Empty(MotionControllerData.HandKeyPositions.Num()); + HandPoseContainer.SkeletalTransforms.Empty(HandTrackingData.HandKeyLocations.Num()); FTransform ParentTrans = FTransform::Identity; - if (MotionControllerData.DeviceVisualType == EXRVisualType::Controller) + + // #TODO: 5.7 Preview!! + // Might need to restore all of this, have to test with vive + /*if (MotionControllerData.DeviceVisualType == EXRVisualType::Controller) { ParentTrans = FTransform(MotionControllerData.GripRotation, MotionControllerData.GripPosition, FVector(1.f)); } - else // EXRVisualType::Hand visual type + else // EXRVisualType::Hand visual type*/ { - ParentTrans = FTransform(MotionControllerData.HandKeyRotations[(uint8)EHandKeypoint::Palm], MotionControllerData.HandKeyPositions[(uint8)EHandKeypoint::Palm], FVector(1.f)); + ParentTrans = FTransform(HandTrackingData.HandKeyRotations[(uint8)EHandKeypoint::Palm], HandTrackingData.HandKeyLocations[(uint8)EHandKeypoint::Palm], FVector(1.f)); } - for (int i = 0; i < MotionControllerData.HandKeyPositions.Num(); ++i) + for (int i = 0; i < HandTrackingData.HandKeyLocations.Num(); ++i) { // Convert to component space, we convert then to parent space later when applying it - HandPoseContainer.SkeletalTransforms.Add(FTransform(MotionControllerData.HandKeyRotations[i].GetNormalized(), MotionControllerData.HandKeyPositions[i], FVector(1.f)).GetRelativeTransform(ParentTrans)); + HandPoseContainer.SkeletalTransforms.Add(FTransform(HandTrackingData.HandKeyRotations[i].GetNormalized(), HandTrackingData.HandKeyLocations[i], FVector(1.f)).GetRelativeTransform(ParentTrans)); } //if (bGetCurlValues) @@ -233,31 +239,33 @@ bool UOpenXRExpansionFunctionLibrary::GetOpenXRFingerCurlValuesForHand( float& RingCurl, float& PinkyCurl) { - FXRMotionControllerData MotionControllerData; - UHeadMountedDisplayFunctionLibrary::GetMotionControllerData(WorldContextObject, TargetHand, MotionControllerData); + FXRHandTrackingState HandTrackingData; + UHeadMountedDisplayFunctionLibrary::GetHandTrackingState(WorldContextObject, EXRSpaceType::UnrealWorldSpace, TargetHand, HandTrackingData); // Fail if the count is too low - if (MotionControllerData.HandKeyPositions.Num() < EHandKeypointCount) + if (HandTrackingData.HandKeyLocations.Num() < EHandKeypointCount) return false; FTransform ParentTrans = FTransform::Identity; - if (MotionControllerData.DeviceVisualType == EXRVisualType::Controller) + // #TODO: 5.7 + // TEST THIS and restore if we need too + /*if (MotionControllerData.DeviceVisualType == EXRVisualType::Controller) { ParentTrans = FTransform(MotionControllerData.GripRotation, MotionControllerData.GripPosition, FVector(1.f)); } - else // EXRVisualType::Hand visual type + else // EXRVisualType::Hand visual type*/ { - ParentTrans = FTransform(MotionControllerData.HandKeyRotations[(uint8)EHandKeypoint::Palm], MotionControllerData.HandKeyPositions[(uint8)EHandKeypoint::Palm], FVector(1.f)); + ParentTrans = FTransform(HandTrackingData.HandKeyRotations[(uint8)EHandKeypoint::Palm], HandTrackingData.HandKeyLocations[(uint8)EHandKeypoint::Palm], FVector(1.f)); } TArray TransformArray; - TransformArray.AddUninitialized(MotionControllerData.HandKeyPositions.Num()); + TransformArray.AddUninitialized(HandTrackingData.HandKeyLocations.Num()); - for (int i = 0; i < MotionControllerData.HandKeyPositions.Num(); ++i) + for (int i = 0; i < HandTrackingData.HandKeyLocations.Num(); ++i) { // Convert to component space, we convert then to parent space later when applying it - TransformArray[i] = FTransform(MotionControllerData.HandKeyRotations[i].GetNormalized(), MotionControllerData.HandKeyPositions[i], FVector(1.f)).GetRelativeTransform(ParentTrans); + TransformArray[i] = FTransform(HandTrackingData.HandKeyRotations[i].GetNormalized(), HandTrackingData.HandKeyLocations[i], FVector(1.f)).GetRelativeTransform(ParentTrans); } ThumbCurl = GetCurlValueForBoneRoot(TransformArray, EHandKeypoint::ThumbMetacarpal); @@ -436,7 +444,7 @@ void UOpenXRExpansionFunctionLibrary::ConvertHandTransformsSpaceAndBack(TArray HandPositionsClosed = { // Closed palm - Left @@ -561,9 +569,9 @@ void UOpenXRExpansionFunctionLibrary::GetMockUpControllerData(FXRMotionControlle FVector(-1019.778f,-479.842f,203.819f) }; - MotionControllerData.HandKeyPositions = /*SkeletalMappingData.TargetHand != EVRSkeletalHandIndex::EActionHandIndex_Left ? HandPositionsOpen : */HandPositionsClosed; + HandTrackingData.HandKeyLocations = /*SkeletalMappingData.TargetHand != EVRSkeletalHandIndex::EActionHandIndex_Left ? HandPositionsOpen : */HandPositionsClosed; - if (SkeletalMappingData.TargetHand != EVRSkeletalHandIndex::EActionHandIndex_Left) + /*if (SkeletalMappingData.TargetHand != EVRSkeletalHandIndex::EActionHandIndex_Left) { MotionControllerData.GripPosition = FVector(-1018.305f, -478.019f, 209.872f); MotionControllerData.GripRotation = FQuat(-0.116352126f, 0.039430488f, -0.757644236f, 0.641001403f); @@ -572,15 +580,15 @@ void UOpenXRExpansionFunctionLibrary::GetMockUpControllerData(FXRMotionControlle { MotionControllerData.GripPosition = FVector(-1202.619f, -521.077f, 283.076f); MotionControllerData.GripRotation = FQuat(0.040843058f, 0.116659224f, 0.980030060f, -0.155767411f); - } - - MotionControllerData.DeviceName = TEXT("OpenXR"); + }*/ + HandTrackingData.DeviceName = TEXT("OpenXR"); + SkeletalMappingData.SkeletalTransforms.Empty(SkeletalMappingData.SkeletalTransforms.Num()); - FTransform ParentTrans = FTransform(MotionControllerData.GripRotation, MotionControllerData.GripPosition, FVector(1.f)); - for (int i = 0; i < MotionControllerData.HandKeyPositions.Num(); i++) + FTransform ParentTrans = FTransform(MotionControllerData.GripUnrealSpaceRotation, MotionControllerData.GripUnrealSpaceLocation, FVector(1.f)); + for (int i = 0; i < HandTrackingData.HandKeyLocations.Num(); i++) { - SkeletalMappingData.SkeletalTransforms.Add(FTransform(MotionControllerData.HandKeyRotations[i], MotionControllerData.HandKeyPositions[i], FVector(1.f)).GetRelativeTransform(ParentTrans)); + SkeletalMappingData.SkeletalTransforms.Add(FTransform(HandTrackingData.HandKeyRotations[i], HandTrackingData.HandKeyLocations[i], FVector(1.f)).GetRelativeTransform(ParentTrans)); } SkeletalMappingData.bHasValidData = (SkeletalMappingData.SkeletalTransforms.Num() == EHandKeypointCount); diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionPlugin.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionPlugin.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionPlugin.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRExpansionPlugin.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRHandPoseComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRHandPoseComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRHandPoseComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/OpenXRHandPoseComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/Serializers/FBPXRSkeletalRepContainerNetSerializer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/Serializers/FBPXRSkeletalRepContainerNetSerializer.cpp new file mode 100644 index 0000000..f2d0688 --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Private/Serializers/FBPXRSkeletalRepContainerNetSerializer.cpp @@ -0,0 +1,340 @@ +#include "Serializers/FBPXRSkeletalRepContainerNetSerializer.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/Serialization/PackedVectorNetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" + +#include "OpenXRHandPoseComponent.h" + + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FBPXRSkeletalRepContainer + // ----------------------------------------------------------------------------- + struct FBPXRSkeletalRepContainerNetSerializer + { + inline static const FVectorNetQuantize100NetSerializerConfig Quantize100SerializerConfig; + + inline static const FNetSerializerConfig* VectorNetQuantizeNetSerializerConfig = &Quantize100SerializerConfig; + inline static const FNetSerializer* VectorNetQuantizeNetSerializer; + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FBPXRSkeletalRepContainerNetSerializer::VectorNetQuantizeNetSerializer = &UE_NET_GET_SERIALIZER(FVectorNetQuantize100NetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FBPXRSkeletalRepContainerNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + /** Version is required. */ + static constexpr uint32 Version = 0; + + struct alignas(8) FSkeletalTransformQuantizedData + { + uint64 Position[4]; // We don't need to store double for tracked device positions, but their forwarded serializer uses it + uint16 Rotation[3]; + }; + + struct alignas(8) FBPXRSkeletalRepContainerQuantizedData + { + uint8 TargetHand; + uint8 bAllowDeformingMesh; + uint8 bEnableUE4HandRepSavings; + + uint16 ElementCount; + FSkeletalTransformQuantizedData SkeletalTransforms[EHandKeypointCount]; + // List of array data, we know the max elements so we can statically set it to that + // Technically should be -6 since we dont use some but im going to future proof it a bit here + }; + + typedef FBPXRSkeletalRepContainer SourceType; + typedef FBPXRSkeletalRepContainerQuantizedData QuantizedType; + typedef FBPXRSkeletalRepContainerNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + + // Not using delta as this struct is sent on a timer and not changed incrementally + + + static constexpr uint32 ElementSizeBytes = sizeof(FSkeletalTransformQuantizedData); + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.TargetHand = (uint8)Source.TargetHand; + Target.bAllowDeformingMesh = Source.bAllowDeformingMesh ? 1 : 0; + Target.bEnableUE4HandRepSavings = Source.bEnableUE4HandRepSavings ? 1 : 0; + + // Free data if non null + Target.ElementCount = 0; + + const uint32 Num = Source.SkeletalTransforms.Num(); + Target.ElementCount = static_cast(Num); + + if (Num > 0) + { + FRotator TargetRot; + FVector TargetLoc; + for (uint16 i = 0; i < Num; ++i) + { + TargetRot = Source.SkeletalTransforms[i].Rotator(); + TargetLoc = Source.SkeletalTransforms[i].GetLocation(); + + Target.SkeletalTransforms[i].Rotation[0] = FRotator::CompressAxisToShort(TargetRot.Pitch); + Target.SkeletalTransforms[i].Rotation[1] = FRotator::CompressAxisToShort(TargetRot.Yaw); + Target.SkeletalTransforms[i].Rotation[2] = FRotator::CompressAxisToShort(TargetRot.Roll); + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&TargetLoc); + MemberArgs.Target = NetSerializerValuePointer(&Target.SkeletalTransforms[i].Position[0]); + Serializer->Quantize(Context, MemberArgs); + } + } + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.TargetHand = (EVRSkeletalHandIndex)Source.TargetHand; + Target.bAllowDeformingMesh = Source.bAllowDeformingMesh != 0; + Target.bEnableUE4HandRepSavings = Source.bEnableUE4HandRepSavings != 0; + + const uint16 Count = Source.ElementCount; + Target.SkeletalTransforms.Reset(); + if (Count > 0) + { + Target.SkeletalTransforms.AddUninitialized(Count); + + const FSkeletalTransformQuantizedData* Data = Source.SkeletalTransforms; + FRotator TargetRot; + FVector TargetLoc; + for (int i = 0; i < Count; ++i) + { + TargetRot.Pitch = FRotator::DecompressAxisFromShort(Data[i].Rotation[0]); + TargetRot.Yaw = FRotator::DecompressAxisFromShort(Data[i].Rotation[1]); + TargetRot.Roll = FRotator::DecompressAxisFromShort(Data[i].Rotation[2]); + TargetRot.Normalize(); + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&TargetLoc); + MemberArgs.Target = NetSerializerValuePointer(&Data[i].Position[0]); + Serializer->Dequantize(Context, MemberArgs); + + Target.SkeletalTransforms[i].SetComponents(TargetRot.Quaternion(), TargetLoc, FVector(1.0f)); + } + } + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + // write header bytes (small fields) — do as bytes for compactness + Writer->WriteBits(Source.TargetHand, 8); + Writer->WriteBits(Source.bAllowDeformingMesh, 1); + Writer->WriteBits(Source.bEnableUE4HandRepSavings, 1); + + int32 BoneCountAdjustment = 6 + (Source.bEnableUE4HandRepSavings != 0 ? 4 : 0); + uint8 TransformCount = EHandKeypointCount - BoneCountAdjustment; + + bool bHasValidData = Source.ElementCount >= TransformCount; + + Writer->WriteBits(bHasValidData, 1); + + if (bHasValidData) + { + // write element count (16 bits) + uint32 ElemCount = Source.ElementCount; + + if (ElemCount < 1) + { + // Write nothing + ElemCount = 0; + } + + Writer->WriteBits(ElemCount, 16); + + const FSkeletalTransformQuantizedData* Data = Source.SkeletalTransforms; + for (uint16 i = 0; i < ElemCount; ++i) + { + if (Source.bAllowDeformingMesh) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Data[i].Position[0]); + Serializer->Serialize(Context, MemberArgs); + } + + Writer->WriteBits(Data[i].Rotation[0], 16); + Writer->WriteBits(Data[i].Rotation[1], 16); + Writer->WriteBits(Data[i].Rotation[2], 16); + } + } + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + // write header bytes (small fields) — do as bytes for compactness + + Target.TargetHand = Reader->ReadBits(8); + Target.bAllowDeformingMesh = Reader->ReadBits(1); + Target.bEnableUE4HandRepSavings = Reader->ReadBits(1); + + int32 BoneCountAdjustment = 6 + (Target.bEnableUE4HandRepSavings != 0 ? 4 : 0); + uint8 TransformCount = EHandKeypointCount - BoneCountAdjustment; + + bool bHasValidData = Reader->ReadBits(1) != 0; + + if (bHasValidData) + { + // write element count (16 bits) + uint32 ElemCount = Reader->ReadBits(16); + + Target.ElementCount = static_cast(ElemCount); + + if (ElemCount > 0) + { + FSkeletalTransformQuantizedData* Data = Target.SkeletalTransforms; + for (uint16 i = 0; i < ElemCount; ++i) + { + if (Target.bAllowDeformingMesh) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Data[i].Position[0]); + Serializer->Deserialize(Context, MemberArgs); + } + + Data[i].Rotation[0] = Reader->ReadBits(16); + Data[i].Rotation[1] = Reader->ReadBits(16); + Data[i].Rotation[2] = Reader->ReadBits(16); + } + } + } + } + + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + + if (L.bAllowDeformingMesh != R.bAllowDeformingMesh) return false; + if (L.bEnableUE4HandRepSavings != R.bEnableUE4HandRepSavings) return false; + if (L.SkeletalTransforms.Num() != R.SkeletalTransforms.Num()) return false; + + // Using L num is valid as we already checked if they are the same count + return FPlatformMemory::Memcmp(L.SkeletalTransforms.GetData(), R.SkeletalTransforms.GetData(), sizeof(FTransform) * L.SkeletalTransforms.Num()) == 0; + } + } + + static void Apply(FNetSerializationContext& Context, const FNetApplyArgs& Args) + { + const SourceType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bAllowDeformingMesh = Source.bAllowDeformingMesh; + Target.bEnableUE4HandRepSavings = Source.bEnableUE4HandRepSavings; + Target.TargetHand = Source.TargetHand; + + // Copys it over with new allocations + Target.SkeletalTransforms = Source.SkeletalTransforms; + } + + static void CloneDynamicState(FNetSerializationContext& Context, const FNetCloneDynamicStateArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + // copy small fields + Target.TargetHand = Source.TargetHand; + Target.bAllowDeformingMesh = Source.bAllowDeformingMesh; + Target.bEnableUE4HandRepSavings = Source.bEnableUE4HandRepSavings; + + // copy elements + Target.ElementCount = Source.ElementCount; + + const uint32 Count = Target.ElementCount; + if (Count > 0) + { + const SIZE_T Bytes = SIZE_T(Count) * ElementSizeBytes; + FMemory::Memcpy(Target.SkeletalTransforms, Source.SkeletalTransforms, Bytes); + } + } + + static void FreeDynamicState(FNetSerializationContext& Context, const FNetFreeDynamicStateArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Source); + Target.ElementCount = 0; + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_BPXRSkeletalRepContainer("BPXRSkeletalRepContainer"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPXRSkeletalRepContainer, FBPXRSkeletalRepContainerNetSerializer); + + FBPXRSkeletalRepContainerNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPXRSkeletalRepContainer); + } + + void FBPXRSkeletalRepContainerNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPXRSkeletalRepContainer); + } + + UE_NET_IMPLEMENT_SERIALIZER(FBPXRSkeletalRepContainerNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/AnimNode_ApplyOpenXRHandPose.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/AnimNode_ApplyOpenXRHandPose.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/AnimNode_ApplyOpenXRHandPose.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/AnimNode_ApplyOpenXRHandPose.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h similarity index 94% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h index dbac085..9caacc3 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionFunctionLibrary.h @@ -93,7 +93,7 @@ public: static void ConvertHandTransformsSpaceAndBack(TArray& OutTransforms, const TArray& WorldTransforms); UFUNCTION(BlueprintCallable, Category = "VRExpansionFunctions|OpenXR", meta = (bIgnoreSelf = "true")) - static void GetMockUpControllerData(FXRMotionControllerData& MotionControllerData, FBPOpenXRActionSkeletalData& SkeletalMappingData, bool bOpenHand = false); + static void GetMockUpControllerData(FXRHandTrackingState& HandTrackingData,FXRMotionControllerState& MotionControllerData, FBPOpenXRActionSkeletalData& SkeletalMappingData, bool bOpenHand = false); // Get a list of all currently tracked devices and their types, index in the array is their device index // Returns failed if the openXR query failed (no interaction profile yet or openXR is not running) diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionPlugin.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionPlugin.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionPlugin.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionPlugin.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h index c064148..232de96 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRExpansionTypes.h @@ -4,6 +4,7 @@ #include "CoreMinimal.h" #include "UObject/ObjectMacros.h" #include "Kismet/BlueprintFunctionLibrary.h" +#include "HeadMountedDisplayTypes.h" #include "Animation/BoneReference.h" #include "UObject/Object.h" #include "Engine/EngineTypes.h" @@ -97,6 +98,10 @@ public: UPROPERTY(EditAnywhere, NotReplicated, BlueprintReadWrite, Category = Default) EVRSkeletalHandIndex TargetHand; + // Used to select the type of pose to retrieve from OpenXR, default is grip but you will want to use Palm when using the palm source for motion controller + UPROPERTY(EditAnywhere, NotReplicated, BlueprintReadWrite, Category = Default) + EXRControllerPoseType PoseType; + // A world scale override that will replace the engines current value and force into the tracked data if non zero UPROPERTY(EditAnywhere, NotReplicated, BlueprintReadWrite, Category = Default) float WorldScaleOverride; @@ -144,6 +149,7 @@ public: bMirrorLeftRight = false; bEnableUE4HandRepSavings = false; TargetHand = EVRSkeletalHandIndex::EActionHandIndex_Right; + PoseType = EXRControllerPoseType::Grip; bHasValidData = false; LastHandGestureIndex = INDEX_NONE; LastHandGesture = NAME_None; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRHandPoseComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRHandPoseComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRHandPoseComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/OpenXRHandPoseComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/Serializers/FBPXRSkeletalRepContainerNetSerializer.h b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/Serializers/FBPXRSkeletalRepContainerNetSerializer.h new file mode 100644 index 0000000..69d281a --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/OpenXRExpansionPlugin/Source/OpenXRExpansionPlugin/Public/Serializers/FBPXRSkeletalRepContainerNetSerializer.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Iris/Serialization/NetSerializer.h" +#include "FBPXRSkeletalRepContainerNetSerializer.generated.h" + +USTRUCT() +struct FBPXRSkeletalRepContainerNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FBPXRSkeletalRepContainerNetSerializer, OPENXREXPANSIONPLUGIN_API); + +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/SPUD b/VIRTUOS_ExpansionPluginTests/Plugins/SPUD index 968fe10..57c25ee 160000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/SPUD +++ b/VIRTUOS_ExpansionPluginTests/Plugins/SPUD @@ -1 +1 @@ -Subproject commit 968fe10c9f08859c64ea88768d5216140fc340d9 +Subproject commit 57c25ee516342f3a4140ca52eb9025580a4f2fd8 diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/StevesUEHelpers b/VIRTUOS_ExpansionPluginTests/Plugins/StevesUEHelpers index d6fbc18..5fe193d 160000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/StevesUEHelpers +++ b/VIRTUOS_ExpansionPluginTests/Plugins/StevesUEHelpers @@ -1 +1 @@ -Subproject commit d6fbc18c862cc9d1e9c8418a16273a8562078403 +Subproject commit 5fe193da6208fbd9626559a66e332c5642496ab3 diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitattributes b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitattributes deleted file mode 100644 index 3373152..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -* text=auto -*.bat eol=crlf \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitignore b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitignore deleted file mode 100644 index 3cdb673..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ - -.hg/ -binaries/ -deriveddatacache/ -.vs/ -build/ -intermediate/ -PACKPLUGIN/ -saved/ -*.orig \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Config/FilterPlugin.ini b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Config/FilterPlugin.ini similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Config/FilterPlugin.ini rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Config/FilterPlugin.ini diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/LICENSE.txt b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/LICENSE.txt deleted file mode 100644 index 986c999..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright Joshua Statzer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/README.md b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/README.md deleted file mode 100644 index fa9c46f..0000000 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/README.md +++ /dev/null @@ -1,48 +0,0 @@ -UE Forums Thread -https://forums.unrealengine.com/development-discussion/vr-ar-development/89050-vr-openvr-expansion-plugin - -Example Template Project -https://github.com/mordentral/VRExpPluginExample - -Website: -www.vreue4.com - -*** - -### Use Of This Plugin ### - -This Plugin is intended to add additional functionality to Open/SteamVR/(All VR now) in UE4. - -### Plugin Website ### -[VREUE4.com](https://vreue4.com) - -### How do I install it? ### - -https://vreue4.com/documentation?section=installation - -**Guides for migrating between different engine versions of the plugin:** - -View the patch notes at www.vreue4.com for migration guides as well. - -**Option 1:** - -Go to www.vreue4.com and downloaded the pre-built binary version for the engine version you are using (not updated with every daily change, only weekly or with large patches). - -Install it into your ProjectName/Plugins Directory (Engine level hasn't worked since 4.25 or so when it stopped letting me reference other plugins when compiling for that). - -**Option 2 (More up to date - preferred if possible):** - -* Clone Or Download Zip and extract this repository to a folder named "VRExpansionPlugin" in your "ProjectName/Plugins" directory, create this directory if it is missing. - -* Add the VRExpansionPlugin to your projects PublicDependencyModuleNames in the projects build.cs if you have c++ code included. - -* IF you do not have c++ code, use the Add New button in the editor and add a blank c++ class to your project. - -* Open up the generated project .SLN file and build the project from the build menu. - -You need to have visual studio installed and follow the UE4 setup guide for it: https://docs.unrealengine.com/latest/INT/Programming/Development/VisualStudioSetup/ - -### How do I use it? ### -### How do I VR? ### - -The template project contains use examples of most of the features of the plugin as well as locomotion modes, interaction methods, and basic multiplayer. diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Resources/Icon128.png b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Resources/Icon128.png similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Resources/Icon128.png rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Resources/Icon128.png diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketComponentDetails.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketComponentDetails.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketComponentDetails.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketComponentDetails.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketVisualizer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketVisualizer.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketVisualizer.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/HandSocketVisualizer.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRExpansionEditor.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRExpansionEditor.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRExpansionEditor.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRExpansionEditor.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRGlobalSettingsDetails.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRGlobalSettingsDetails.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRGlobalSettingsDetails.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Private/VRGlobalSettingsDetails.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketComponentDetails.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketComponentDetails.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketComponentDetails.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketComponentDetails.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketVisualizer.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketVisualizer.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketVisualizer.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/HandSocketVisualizer.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRExpansionEditor.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRExpansionEditor.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRExpansionEditor.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRExpansionEditor.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRGlobalSettingsDetails.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRGlobalSettingsDetails.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRGlobalSettingsDetails.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/Public/VRGlobalSettingsDetails.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/VRExpansionEditor.Build.cs b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/VRExpansionEditor.Build.cs similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionEditor/VRExpansionEditor.Build.cs rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionEditor/VRExpansionEditor.Build.cs diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/CharacterMovementCompTypes.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/CharacterMovementCompTypes.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/CharacterMovementCompTypes.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/CharacterMovementCompTypes.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp index bfb4cfe..bc22d09 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripMotionControllerComponent.cpp @@ -1257,6 +1257,55 @@ void UGripMotionControllerComponent::SetGripStiffnessAndDamping( } } +void UGripMotionControllerComponent::SetGripAdvancedGripSettings( + const FBPActorGripInformation& Grip, + EBPVRResultSwitch& Result, + uint8 GripPriority, + bool bSetOwnerOnGrip, + bool bDisallowLerping, + bool bDisallowSettingPositionOnClientAuthDrop +) +{ + Result = EBPVRResultSwitch::OnFailed; + int fIndex = GrippedObjects.Find(Grip); + + if (fIndex != INDEX_NONE) + { + GrippedObjects[fIndex].AdvancedGripSettings.GripPriority = GripPriority; + GrippedObjects[fIndex].AdvancedGripSettings.bSetOwnerOnGrip = bSetOwnerOnGrip; + GrippedObjects[fIndex].AdvancedGripSettings.bDisallowLerping = bDisallowLerping; + GrippedObjects[fIndex].AdvancedGripSettings.bDisallowSettingPositionOnClientAuthDrop = bDisallowSettingPositionOnClientAuthDrop; + + DIRTY_GRIPPED_OBJECTS(); + + Result = EBPVRResultSwitch::OnSucceeded; + } + else + { + fIndex = LocallyGrippedObjects.Find(Grip); + + if (fIndex != INDEX_NONE) + { + GrippedObjects[fIndex].AdvancedGripSettings.GripPriority = GripPriority; + GrippedObjects[fIndex].AdvancedGripSettings.bSetOwnerOnGrip = bSetOwnerOnGrip; + GrippedObjects[fIndex].AdvancedGripSettings.bDisallowLerping = bDisallowLerping; + GrippedObjects[fIndex].AdvancedGripSettings.bDisallowSettingPositionOnClientAuthDrop = bDisallowSettingPositionOnClientAuthDrop; + + if (IsLocallyControlled() && !IsServer() && !IsTornOff() && LocallyGrippedObjects[fIndex].GripMovementReplicationSetting == EGripMovementReplicationSettings::ClientSide_Authoritive) + { + FBPActorGripInformation GripInfo = LocallyGrippedObjects[fIndex]; + Server_NotifyLocalGripAddedOrChanged(GripInfo); + } + + DIRTY_LOCALLY_GRIPPED_OBJECTS(); + + Result = EBPVRResultSwitch::OnSucceeded; + } + } + + +} + FTransform UGripMotionControllerComponent::CreateGripRelativeAdditionTransform_BP( const FBPActorGripInformation &GripToSample, const FTransform & AdditionTransform, @@ -7976,7 +8025,17 @@ void UGripMotionControllerComponent::Server_NotifyLocalGripRemoved_Implementatio { if (IsValid(DroppingActor) && TransformAtDrop.IsValid()) { - DroppingActor->SetActorTransform(TransformAtDrop, false, nullptr, ETeleportType::None); + bool bSkipSetTransform = false; + if (DroppingActor->GetClass()->ImplementsInterface(UVRGripInterface::StaticClass())) + { + FBPAdvGripSettings AdvSettings = IVRGripInterface::Execute_AdvancedGripSettings(DroppingActor); + bSkipSetTransform = AdvSettings.bDisallowSettingPositionOnClientAuthDrop; + } + + if (!bSkipSetTransform) + { + DroppingActor->SetActorTransform(TransformAtDrop, false, nullptr, ETeleportType::None); + } } } }break; @@ -7986,7 +8045,17 @@ void UGripMotionControllerComponent::Server_NotifyLocalGripRemoved_Implementatio { if (IsValid(DroppingComp) && TransformAtDrop.IsValid()) { - DroppingComp->SetWorldTransform(TransformAtDrop, false, nullptr, ETeleportType::None); + bool bSkipSetTransform = false; + if (DroppingComp->GetClass()->ImplementsInterface(UVRGripInterface::StaticClass())) + { + FBPAdvGripSettings AdvSettings = IVRGripInterface::Execute_AdvancedGripSettings(DroppingComp); + bSkipSetTransform = AdvSettings.bDisallowSettingPositionOnClientAuthDrop; + } + + if (!bSkipSetTransform) + { + DroppingComp->SetWorldTransform(TransformAtDrop, false, nullptr, ETeleportType::None); + } } } }break; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Default.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Default.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Default.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Default.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_GunTools.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_GunTools.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_GunTools.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_GunTools.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_InteractibleSettings.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_InteractibleSettings.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_InteractibleSettings.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_InteractibleSettings.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_LerpToHand.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_LerpToHand.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_LerpToHand.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_LerpToHand.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Melee.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Melee.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Melee.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Melee.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Physics.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Physics.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Physics.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/GS_Physics.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/VRGripScriptBase.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/VRGripScriptBase.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/VRGripScriptBase.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/GripScripts/VRGripScriptBase.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp index 2fcaeff..205e30e 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableActor.cpp @@ -50,7 +50,7 @@ AGrippableActor::AGrippableActor(const FObjectInitializer& ObjectInitializer) // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; // Setting a minimum of every 3rd frame (VR 90fps) for replication consideration // Otherwise we will get some massive slow downs if the replication is allowed to hit the 2 per second minimum default @@ -756,22 +756,6 @@ void AGrippableActor::BeginDestroy() GripLogicScripts.Empty(); } -void AGrippableActor::GetSubobjectsWithStableNamesForNetworking(TArray& ObjList) -{ - Super::GetSubobjectsWithStableNamesForNetworking(ObjList); - - if (bReplicateGripScripts) - { - for (int32 i = 0; i < GripLogicScripts.Num(); ++i) - { - if (UObject* SubObject = GripLogicScripts[i]) - { - ObjList.Add(SubObject); - } - } - } -} - ///////////////////////////////////////////////// //- Push networking getter / setter functions ///////////////////////////////////////////////// diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp index ec8f05d..0a77bbb 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableBoxComponent.cpp @@ -44,7 +44,7 @@ UGrippableBoxComponent::UGrippableBoxComponent(const FObjectInitializer& ObjectI // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; } void UGrippableBoxComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp index 9178cb5..937a80c 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCapsuleComponent.cpp @@ -40,7 +40,7 @@ UGrippableCapsuleComponent::UGrippableCapsuleComponent(const FObjectInitializer& // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; } void UGrippableCapsuleComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCharacter.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCharacter.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCharacter.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableCharacter.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp similarity index 84% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp index c6be104..3fc573e 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableDataTypes.cpp @@ -5,8 +5,7 @@ #include "GameFramework/Actor.h" - -bool FRepAttachmentWithWeld::NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) +/*bool FRepAttachmentWithWeld::NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) { // Our additional weld bit is here Ar.SerializeBits(&bIsWelded, 1); @@ -17,9 +16,9 @@ bool FRepAttachmentWithWeld::NetSerialize(FArchive& Ar, class UPackageMap* Map, Ar << AttachSocket; Ar << AttachComponent; return true; -} +}*/ FRepAttachmentWithWeld::FRepAttachmentWithWeld() { bIsWelded = false; -} \ No newline at end of file +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp similarity index 97% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp index bf2a9d5..3c8abb9 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippablePhysicsReplication.cpp @@ -48,6 +48,7 @@ namespace VRPhysicsReplicationStatics namespace RenderInterpolationCVars { bool bRenderInterpDebugDrawResimTrigger = false; + float RenderInterpDebugDrawResimBoxScale = 1.0f; } namespace PhysicsReplicationCVars @@ -81,6 +82,7 @@ namespace PhysicsReplicationCVars float VelStabilityMultiplier = 0.5f; float AngVelStabilityMultiplier = 0.5f; bool bDrawDebug = false; + float LogOutOfBoundsTimeLimit = 5.0f; // Inside of NetworkPhysicsComponent - UPDATE AS CHANGE int32 RedundantInputs = 2; @@ -92,6 +94,11 @@ namespace PhysicsReplicationCVars bool bCompareInputToTriggerRewind = false; bool bEnableUnreliableFlow = true; bool bEnableReliableFlow = false; + + bool bTriggerResimOnInputReceive = false; + bool bApplyInputDecayOverSetTime = false; + float InputDecaySetTime = 0.15f; + bool bApplyDataInsteadOfMergeData = false; bool bAllowInputExtrapolation = true; bool bValidateDataOnGameThread = false; @@ -542,12 +549,13 @@ bool FPhysicsReplicationVR::ApplyRigidBodyState(float DeltaSeconds, FBodyInstanc bool bCorrectConnectedBodiesFriction = CVarCorrectConnectedBodiesFriction->GetBool(); // Assign per-actor settings from NetworkPhysicSettingsComponent if this actor has one - if (SettingsCurrent.Get()) + if (SettingsCurrent.IsValid()) { - MaxLinearHardSnapDistance = SettingsCurrent.Get()->DefaultReplicationSettings.GetMaxLinearHardSnapDistance(MaxLinearHardSnapDistance); - bHardsnapLegacyInPT = SettingsCurrent.Get()->DefaultReplicationSettings.GetHardsnapDefaultLegacyInPT(); - bCorrectConnectedBodies = SettingsCurrent.Get()->DefaultReplicationSettings.GetCorrectConnectedBodies(); - bCorrectConnectedBodiesFriction = SettingsCurrent.Get()->DefaultReplicationSettings.GetCorrectConnectedBodiesFriction(); + const FNetworkPhysicsSettingsData& SettingsData = SettingsCurrent.Pin()->GetSettings(); + MaxLinearHardSnapDistance = SettingsData.DefaultReplicationSettings.GetMaxLinearHardSnapDistance(MaxLinearHardSnapDistance); + bHardsnapLegacyInPT = SettingsData.DefaultReplicationSettings.GetHardsnapDefaultLegacyInPT(); + bCorrectConnectedBodies = SettingsData.DefaultReplicationSettings.GetCorrectConnectedBodies(); + bCorrectConnectedBodiesFriction = SettingsData.DefaultReplicationSettings.GetCorrectConnectedBodiesFriction(); } // Get Current state @@ -1042,19 +1050,19 @@ void FPhysicsReplicationAsyncVR::OnPhysicsObjectUnregistered_Internal(Chaos::FCo ObjectToSettings.Remove(PhysicsObject); } -void FPhysicsReplicationAsyncVR::RegisterSettings(Chaos::FConstPhysicsObjectHandle PhysicsObject, FNetworkPhysicsSettingsAsync InSettings) +void FPhysicsReplicationAsyncVR::RegisterSettings(Chaos::FConstPhysicsObjectHandle PhysicsObject, TWeakPtr InSettings) { if (PhysicsObject != nullptr) { - FNetworkPhysicsSettingsAsync& Settings = ObjectToSettings.FindOrAdd(PhysicsObject); + TWeakPtr& Settings = ObjectToSettings.FindOrAdd(PhysicsObject); Settings = InSettings; } } void FPhysicsReplicationAsyncVR::FetchObjectSettings(Chaos::FConstPhysicsObjectHandle PhysicsObject) { - FNetworkPhysicsSettingsAsync* CustomSettings = ObjectToSettings.Find(PhysicsObject); - SettingsCurrent = (CustomSettings != nullptr) ? *CustomSettings : SettingsDefault; + TWeakPtr* CustomSettings = ObjectToSettings.Find(PhysicsObject); + SettingsCurrent = (CustomSettings && (*CustomSettings).IsValid()) ? *(*CustomSettings).Pin().Get() : SettingsDefault; } void FPhysicsReplicationAsyncVR::OnPostInitialize_Internal() @@ -1080,6 +1088,8 @@ void FPhysicsReplicationAsyncVR::OnPreSimulate_Internal() Chaos::FPBDRigidsSolver* RigidsSolver = static_cast(GetSolver()); check(RigidsSolver); + ResimErrorLogTimer += RigidsSolver->GetAsyncDeltaTime(); + // Early out if this is a resim frame Chaos::FRewindData* RewindData = RigidsSolver->GetRewindData(); const bool bRewindDataExist = RewindData != nullptr; @@ -1215,7 +1225,7 @@ void FPhysicsReplicationAsyncVR::UpdateRewindDataTarget(const FPhysicsRepAsyncIn { // Cache all target states inside RewindData const int32 LocalFrame = Input.ServerFrame - *Input.FrameOffset; - RewindData->SetTargetStateAtFrame(*Handle, LocalFrame, Chaos::FFrameAndPhase::EParticleHistoryPhase::PostPushData, + RewindData->SetTargetStateAtFrame(*Handle, LocalFrame, Chaos::FFrameAndPhase::EParticleHistoryPhase::PrePushData, Input.TargetState.Position, Input.TargetState.Quaternion, Input.TargetState.LinVel, FMath::DegreesToRadians(Input.TargetState.AngVel), (Input.TargetState.Flags & ERigidBodyFlags::Sleeping)); } @@ -1565,8 +1575,28 @@ void FPhysicsReplicationAsyncVR::CheckTargetResimValidity(FReplicatedPhysicsTarg Target.RepMode = EPhysicsReplicationMode::PredictiveInterpolation; } - UE_LOG(LogPhysics, Warning, TEXT("FPhysicsReplication received target frame (%d) out of rewind data bounds (%d, %d) - %s - Target will use EPhysicsReplicationMode: %s"), - LocalFrame, RewindData->GetEarliestFrame_Internal(), RewindData->CurrentFrame(), (LocalFrame < RewindData->GetEarliestFrame_Internal()) ? TEXT("Client is far ahead of the server, server might be dropping frames.") : TEXT("Client is behind the server, client might be dropping frames."), *UEnum::GetValueAsString(Target.RepMode)); + if (ResimOutOfBoundsCounter == 0) + { + UE_LOG(LogPhysics, Warning, TEXT("FPhysicsReplication DESYNCED - received target frame (%d) out of rewind data bounds (%d, %d) - %s - Target will use %s") + , LocalFrame, RewindData->GetEarliestFrame_Internal(), RewindData->CurrentFrame() + , (LocalFrame < RewindData->GetEarliestFrame_Internal()) + ? TEXT("Client is far ahead of the server, server might be dropping frames.") + : TEXT("Client is behind the server, client might be dropping frames."), *UEnum::GetValueAsString(Target.RepMode)); + } + + ResimOutOfBoundsCounter++; + ResimErrorLogTimer = 0; + } + else + { + static const auto CVarLogOutOfBoundsTimeLimit = IConsoleManager::Get().FindConsoleVariable(TEXT("np2.Resim.LogOutOfBoundsTimeLimit")); + + if (ResimOutOfBoundsCounter > 0 && ResimErrorLogTimer > CVarLogOutOfBoundsTimeLimit->GetFloat()) + { + UE_LOG(LogPhysics, Log, TEXT("FPhysicsReplication IN-SYNC - Received targets have now been within rewind data bounds again for at least %f seconds"), ResimErrorLogTimer); + + ResimOutOfBoundsCounter = 0; + } } } @@ -2429,7 +2459,7 @@ bool FPhysicsReplicationAsyncVR::ResimulationReplication(Chaos::FPBDRigidParticl const bool bShouldSleep = (Target.TargetState.Flags & ERigidBodyFlags::Sleeping) != 0; bool bClearTarget = true; - static constexpr Chaos::FFrameAndPhase::EParticleHistoryPhase RewindPhase = Chaos::FFrameAndPhase::EParticleHistoryPhase::PostPushData; + static constexpr Chaos::FFrameAndPhase::EParticleHistoryPhase RewindPhase = Chaos::FFrameAndPhase::EParticleHistoryPhase::PrePushData; // Get state from locally cached history for frame corresponding to received data const Chaos::FGeometryParticleState PastState = RewindData->GetPastStateAtFrame(*Handle, LocalFrame, RewindPhase); @@ -2515,12 +2545,15 @@ bool FPhysicsReplicationAsyncVR::ResimulationReplication(Chaos::FPBDRigidParticl static const auto CVarResimDrawDebug = IConsoleManager::Get().FindConsoleVariable(TEXT("np2.Resim.DrawDebug")); static const auto CVarRenderInterpDebugDrawResimTrigger = IConsoleManager::Get().FindConsoleVariable(TEXT("p.RenderInterp.DebugDraw.ResimTrigger")); + static const auto CVarRenderInterpDebugDrawResimBoxScale = IConsoleManager::Get().FindConsoleVariable(TEXT("p.RenderInterp.DebugDraw.ResimBoxScale")); if (CVarResimDrawDebug->GetBool() || CVarRenderInterpDebugDrawResimTrigger->GetBool()) { if (bShouldTriggerResim) { FVector Box = CVarRenderInterpDebugDrawResimTrigger->GetBool() ? FVector(6, 3, 2) : FVector(40, 20, 10); - const float DrawThickness = CVarRenderInterpDebugDrawResimTrigger->GetBool() ? 0.5f : 1.5f; + Box *= CVarRenderInterpDebugDrawResimBoxScale->GetFloat(); + const float DrawThickness = (CVarRenderInterpDebugDrawResimTrigger->GetBool() ? 0.5f : 1.5f) * CVarRenderInterpDebugDrawResimBoxScale->GetFloat(); + static const auto CVarDebugdrawLifetime = IConsoleManager::Get().FindConsoleVariable(TEXT("p.Net.DebugDraw.LifeTime")); if (CVarRenderInterpDebugDrawResimTrigger->GetBool()) // Resim debug draw extension for render interpolation diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp index 5e39bc3..50f32d9 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshActor.cpp @@ -152,7 +152,7 @@ AGrippableSkeletalMeshActor::AGrippableSkeletalMeshActor(const FObjectInitialize // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; bAllowIgnoringAttachOnOwner = true; @@ -857,22 +857,6 @@ void AGrippableSkeletalMeshActor::BeginDestroy() GripLogicScripts.Empty(); } -void AGrippableSkeletalMeshActor::GetSubobjectsWithStableNamesForNetworking(TArray& ObjList) -{ - Super::GetSubobjectsWithStableNamesForNetworking(ObjList); - - if (bReplicateGripScripts) - { - for (int32 i = 0; i < GripLogicScripts.Num(); ++i) - { - if (UObject* SubObject = GripLogicScripts[i]) - { - ObjList.Add(SubObject); - } - } - } -} - ///////////////////////////////////////////////// //- Push networking getter / setter functions ///////////////////////////////////////////////// diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp index 78f3fcd..1ac491b 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSkeletalMeshComponent.cpp @@ -41,7 +41,7 @@ UGrippableSkeletalMeshComponent::UGrippableSkeletalMeshComponent(const FObjectIn // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; } void UGrippableSkeletalMeshComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp index 6fca280..4f6fca9 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableSphereComponent.cpp @@ -40,7 +40,7 @@ UGrippableSphereComponent::UGrippableSphereComponent(const FObjectInitializer& O // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; } void UGrippableSphereComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp index 485ba79..111bca7 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshActor.cpp @@ -97,7 +97,7 @@ AGrippableStaticMeshActor::AGrippableStaticMeshActor(const FObjectInitializer& O // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; bAllowIgnoringAttachOnOwner = true; @@ -801,22 +801,6 @@ void AGrippableStaticMeshActor::BeginDestroy() GripLogicScripts.Empty(); } -void AGrippableStaticMeshActor::GetSubobjectsWithStableNamesForNetworking(TArray& ObjList) -{ - Super::GetSubobjectsWithStableNamesForNetworking(ObjList); - - if (bReplicateGripScripts) - { - for (int32 i = 0; i < GripLogicScripts.Num(); ++i) - { - if (UObject* SubObject = GripLogicScripts[i]) - { - ObjList.Add(SubObject); - } - } - } -} - ///////////////////////////////////////////////// //- Push networking getter / setter functions ///////////////////////////////////////////////// diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp index 1f6b0bc..5a25a56 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/GrippableStaticMeshComponent.cpp @@ -39,7 +39,7 @@ UGrippableStaticMeshComponent::UGrippableStaticMeshComponent(const FObjectInitia // #TODO we can register them maybe in the future // Don't use the replicated list, use our custom replication instead - bReplicateUsingRegisteredSubObjectList = false; + bReplicateUsingRegisteredSubObjectList = true; } void UGrippableStaticMeshComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/HandSocketComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/HandSocketComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/HandSocketComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Grippables/HandSocketComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRButtonComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRButtonComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRButtonComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRButtonComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp index d6ec172..739365a 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRDialComponent.cpp @@ -399,7 +399,9 @@ void UVRDialComponent::GetGripStiffnessAndDamping_Implementation(float &GripStif FBPAdvGripSettings UVRDialComponent::AdvancedGripSettings_Implementation() { - return FBPAdvGripSettings(GripPriority); + FBPAdvGripSettings GripSettings(GripPriority); + GripSettings.bDisallowSettingPositionOnClientAuthDrop = true; + return GripSettings; } float UVRDialComponent::GripBreakDistance_Implementation() diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRInteractibleFunctionLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRInteractibleFunctionLibrary.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRInteractibleFunctionLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRInteractibleFunctionLibrary.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp index 44ca29f..2dfff7e 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRLeverComponent.cpp @@ -541,7 +541,9 @@ void UVRLeverComponent::GetGripStiffnessAndDamping_Implementation(float &GripSti FBPAdvGripSettings UVRLeverComponent::AdvancedGripSettings_Implementation() { - return FBPAdvGripSettings(GripPriority); + FBPAdvGripSettings GripSettings(GripPriority); + GripSettings.bDisallowSettingPositionOnClientAuthDrop = true; + return GripSettings; } float UVRLeverComponent::GripBreakDistance_Implementation() diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp index 115e95a..3dde8ee 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRMountComponent.cpp @@ -514,7 +514,9 @@ void UVRMountComponent::GetGripStiffnessAndDamping_Implementation(float &GripSti FBPAdvGripSettings UVRMountComponent::AdvancedGripSettings_Implementation() { - return FBPAdvGripSettings(GripPriority); + FBPAdvGripSettings GripSettings(GripPriority); + GripSettings.bDisallowSettingPositionOnClientAuthDrop = true; + return GripSettings; } float UVRMountComponent::GripBreakDistance_Implementation() diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp index acc881d..0e6d8a3 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Interactibles/VRSliderComponent.cpp @@ -644,7 +644,9 @@ void UVRSliderComponent::GetGripStiffnessAndDamping_Implementation(float &GripSt FBPAdvGripSettings UVRSliderComponent::AdvancedGripSettings_Implementation() { - return FBPAdvGripSettings(GripPriority); + FBPAdvGripSettings GripSettings(GripPriority); + GripSettings.bDisallowSettingPositionOnClientAuthDrop = true; + return GripSettings; } float UVRSliderComponent::GripBreakDistance_Implementation() diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/BucketUpdateSubsystem.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/BucketUpdateSubsystem.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/BucketUpdateSubsystem.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/BucketUpdateSubsystem.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/CollisionIgnoreSubsystem.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/CollisionIgnoreSubsystem.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/CollisionIgnoreSubsystem.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/CollisionIgnoreSubsystem.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/OptionalRepSkeletalMeshActor.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/OptionalRepSkeletalMeshActor.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/OptionalRepSkeletalMeshActor.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/OptionalRepSkeletalMeshActor.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRAIPerceptionOverrides.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRAIPerceptionOverrides.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRAIPerceptionOverrides.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRAIPerceptionOverrides.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VREPhysicalAnimationComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VREPhysicalAnimationComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VREPhysicalAnimationComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VREPhysicalAnimationComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRFullScreenUserWidget.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRFullScreenUserWidget.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRFullScreenUserWidget.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRFullScreenUserWidget.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRGameViewportClient.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRGameViewportClient.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRGameViewportClient.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRGameViewportClient.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRLogComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRLogComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRLogComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRLogComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRPlayerStart.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRPlayerStart.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRPlayerStart.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRPlayerStart.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp similarity index 65% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp index 2bc26e8..f1bdf5b 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Misc/VRRenderTargetManager.cpp @@ -25,6 +25,19 @@ #include "Materials/Material.h" #include "Net/UnrealNetwork.h" +// Iris +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/ObjectNetSerializer.h" +#include "Iris/Core/NetObjectReference.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" +#include "Templates/IsPODType.h" + +#include "Iris/Serialization/SoftObjectNetSerializers.h" +#include "Iris/Serialization/NetSerializerArrayStorage.h" + namespace RLE_Funcs { enum RLE_Flags @@ -1741,7 +1754,6 @@ bool FRenderManagerOperation::NetSerialize(FArchive& Ar, class UPackageMap* Map, { bOutSuccess = true; - Ar.SerializeIntPacked(OwnerID); Ar.SerializeBits(&OperationType, 3); @@ -1813,3 +1825,725 @@ bool FRenderManagerOperation::NetSerialize(FArchive& Ar, class UPackageMap* Map, return bOutSuccess; } + +// SERIALIZER SETUP FOR IRIS +namespace UE::Net +{ + struct alignas(8) FQuantizedRenderTargetTextureStoreData + { + uint32 Width; + uint32 Height; + uint32 bIsZipped; + + // I don't think people are going to go over the 512 default generally, and def shouldn't hit 2048 + // We'll accept the slightly larger memory usage as this isn't a common operation + //static constexpr uint32 MaxBlobStorage = 2048; + //, AllocationPolicies::TInlinedElementAllocationPolicy + typedef FNetSerializerArrayStorage DataStorage; + DataStorage Data; + }; +} + +template <> struct TIsPODType { enum { Value = true }; }; + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FBPVRReplicatedTextureStore + // ----------------------------------------------------------------------------- + struct FBPVRReplicatedTextureStoreNetSerializer + { + // Version is required. + static constexpr uint32 Version = 0; + + //Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. + static constexpr bool bUseDefaultDelta = true; + // Not doing delta, the majority of the time a single bit (bool) controls the serialization of the entirity + + static constexpr bool bHasDynamicState = true; + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FBPVRReplicatedTextureStoreNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + typedef FBPVRReplicatedTextureStore SourceType; + typedef FQuantizedRenderTargetTextureStoreData QuantizedType; + typedef FBPVRReplicatedTextureStoreSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.bIsZipped = Source.bIsZipped ? 1 : 0; + Target.Width = Source.Width; + Target.Height = Source.Height; + + Target.Data.AdjustSize(Context, Source.PackedData.Num()); + + if (Target.Data.Num() > 0) + { + FMemory::Memcpy(Target.Data.GetData(), Source.PackedData.GetData(), Target.Data.Num()); + } + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bIsZipped = Source.bIsZipped != 0; + Target.Width = Source.Width; + Target.Height = Source.Height; + + //Target.Size = Source.PackedData.Num(); + Target.PackedData.Reset(Source.Data.Num()); + + if (Source.Data.Num() > 0) + { + Target.PackedData.AddUninitialized(Source.Data.Num()); + FMemory::Memcpy(Target.PackedData.GetData(), Source.Data.GetData(), Source.Data.Num()); + } + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(Source.bIsZipped, 1); + Writer->WriteBits(Source.Width, 32); + Writer->WriteBits(Source.Height, 32); + + // Write array size first + uint32 Size = Source.Data.Num(); + Writer->WriteBits(Size, 32); + + if (Size > 0) + { + Writer->WriteBitStream((uint32*)Source.Data.GetData(), 0, Source.Data.Num() * 8); + } + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.bIsZipped = Reader->ReadBits(1); + Target.Width = Reader->ReadBits(32); + Target.Height = Reader->ReadBits(32); + + uint32 Size = Reader->ReadBits(32); + Target.Data.AdjustSize(Context, Size); + + if (Size > 0) + { + Reader->ReadBitStream((uint32*)Target.Data.GetData(), Target.Data.Num() * 8); + } + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + // This struct is never stored, it is only packed and sent once to catch a client up + return false; + } + + static void CloneDynamicState(FNetSerializationContext& Context, const FNetCloneDynamicStateArgs& Args) + { + const QuantizedType* Source = reinterpret_cast(Args.Source); + QuantizedType* Target = reinterpret_cast(Args.Target); + + // copy small fields + Target->bIsZipped = Source->bIsZipped; + Target->Width = Source->Width; + Target->Height = Source->Height; + + Target->Data.Clone(Context, Source->Data); + } + + static void FreeDynamicState(FNetSerializationContext& Context, const FNetFreeDynamicStateArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Source); + Target.Data.Free(Context); + } + }; +} + +namespace UE::Net +{ + + struct alignas(8) FQuantizedTriData + { + uint16 P1[2]; + uint16 P2[2]; + uint16 P3[2]; + }; + + // TODO check on this if it changes over time..... + // Really needs to be a macro for getting struct sizes outside of the private files.... + struct FQuantizedSoftObjectRef + { + alignas(8) uint8 Storage[64]; // Iris’ FSoftObjectNetSerializerQuantizedType is 48 bytes + // Keeping some overhead + }; + + struct alignas(8) FQuantizedRenderManagerOperationData + { + uint32 OwnerID; + uint8 OperationType; + uint32 Color; + uint16 P1[2]; + uint16 P2[2]; + uint32 Thickness; + + typedef FNetSerializerArrayStorage TriStorage; + TriStorage Tris; + + //String data + FQuantizedSoftObjectRef Texture; + FQuantizedSoftObjectRef Material; + }; +} + +template <> struct TIsPODType { enum { Value = true }; }; + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FRenderManagerOperation + // ----------------------------------------------------------------------------- + struct FRenderManagerOperationNetSerializer + { + inline static const FSoftObjectNetSerializerConfig ObjectPtrNetSerializerConfig; + + inline static const FNetSerializerConfig* FObjectPtrSerializerConfigPtr = &ObjectPtrNetSerializerConfig; + inline static const FNetSerializer* FObjectPtrNetSerializerPtr; + + // Version is required. + static constexpr uint32 Version = 0; + + //Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. + static constexpr bool bUseDefaultDelta = true; + // Not doing delta, the majority of the time a single bit (bool) controls the serialization of the entirity + + static constexpr bool bHasDynamicState = true; + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FRenderManagerOperationNetSerializer::FObjectPtrNetSerializerPtr = &UE_NET_GET_SERIALIZER(FSoftObjectNetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FRenderManagerOperationNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + typedef FRenderManagerOperation SourceType; + typedef FQuantizedRenderManagerOperationData QuantizedType; + typedef FRenderManagerOperationSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.OwnerID = Source.OwnerID; + Target.OperationType = (uint8)Source.OperationType; + + + switch ((ERenderManagerOperationType)Source.OperationType) + { + case ERenderManagerOperationType::Op_LineDraw: + { + // Color + uint8* ColorPtr = ((uint8*)&Target.Color); + ColorPtr[0] = Source.Color.R; + ColorPtr[1] = Source.Color.G; + ColorPtr[2] = Source.Color.B; + ColorPtr[3] = Source.Color.A; + + // Thickness + Target.Thickness = Source.Thickness; + + //P 1 1, 20 + //P 2 2, 20 + Target.P1[0] = (uint16)GetCompressedFloat<10000, 16>(Source.P1.X); + Target.P1[1] = (uint16)GetCompressedFloat<10000, 16>(Source.P1.Y); + Target.P2[0] = (uint16)GetCompressedFloat<10000, 16>(Source.P2.X); + Target.P2[1] = (uint16)GetCompressedFloat<10000, 16>(Source.P2.Y); + + }break; + + case ERenderManagerOperationType::Op_TexDraw: + { + // Texture + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Texture + FNetQuantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.Texture); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.Texture); + ObjSerializer->Quantize(Context, MemberArgsObj); + + // P1 1, 20 + Target.P1[0] = (uint16)GetCompressedFloat<10000, 16>(Source.P1.X); + Target.P1[1] = (uint16)GetCompressedFloat<10000, 16>(Source.P1.Y); + + }break; + + case ERenderManagerOperationType::Op_TriDraw: + { + // Color + uint8* ColorPtr = ((uint8*)&Target.Color); + ColorPtr[0] = Source.Color.R; + ColorPtr[1] = Source.Color.G; + ColorPtr[2] = Source.Color.B; + ColorPtr[3] = Source.Color.A; + + // Material + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Material + FNetQuantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.Material); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.Material); + ObjSerializer->Quantize(Context, MemberArgsObj); + + // Tris + Target.Tris.AdjustSize(Context, Source.Tris.Num()); + FQuantizedTriData* TargetTriData = Target.Tris.GetData(); + + if (Target.Tris.Num() > 0) + { + for (uint32 i = 0; i < Target.Tris.Num(); ++i) + { + TargetTriData[i].P1[0] = (uint16)GetCompressedFloat<10000, 16>(Source.Tris[i].P1.X); + TargetTriData[i].P1[1] = (uint16)GetCompressedFloat<10000, 16>(Source.Tris[i].P1.Y); + TargetTriData[i].P2[0] = (uint16)GetCompressedFloat<10000, 16>(Source.Tris[i].P2.X); + TargetTriData[i].P2[1] = (uint16)GetCompressedFloat<10000, 16>(Source.Tris[i].P2.Y); + TargetTriData[i].P3[0] = (uint16)GetCompressedFloat<10000, 16>(Source.Tris[i].P3.X); + TargetTriData[i].P3[1] = (uint16)GetCompressedFloat<10000, 16>(Source.Tris[i].P3.Y); + } + } + + }break; + } + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.OwnerID = Source.OwnerID; + Target.OperationType = (ERenderManagerOperationType)Source.OperationType; + + + switch ((ERenderManagerOperationType)Source.OperationType) + { + case ERenderManagerOperationType::Op_LineDraw: + { + // Color + uint8* ColorPtr = ((uint8*)&Source.Color); + Target.Color.R = ColorPtr[0]; + Target.Color.G = ColorPtr[1]; + Target.Color.B = ColorPtr[2]; + Target.Color.A = ColorPtr[3]; + + // Thickness + Target.Thickness = Source.Thickness; + + //P 1 1, 20 + //P 2 2, 20 + Target.P1.X = GetDecompressedFloat<10000, 16>(Source.P1[0]); + Target.P1.Y = GetDecompressedFloat<10000, 16>(Source.P1[1]); + + Target.P2.X = GetDecompressedFloat<10000, 16>(Source.P2[0]); + Target.P2.Y = GetDecompressedFloat<10000, 16>(Source.P2[1]); + + }break; + + case ERenderManagerOperationType::Op_TexDraw: + { + // Texture + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Texture + FNetDequantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.Texture); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.Texture); + ObjSerializer->Dequantize(Context, MemberArgsObj); + + // P1 1, 20 + Target.P1.X = GetDecompressedFloat<10000, 16>(Source.P1[0]); + Target.P1.Y = GetDecompressedFloat<10000, 16>(Source.P1[1]); + + }break; + + case ERenderManagerOperationType::Op_TriDraw: + { + // Color + uint8* ColorPtr = ((uint8*)&Source.Color); + Target.Color.R = ColorPtr[0]; + Target.Color.G = ColorPtr[1]; + Target.Color.B = ColorPtr[2]; + Target.Color.A = ColorPtr[3]; + + // Material + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Material + FNetDequantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.Material); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.Material); + ObjSerializer->Dequantize(Context, MemberArgsObj); + + // Tris + Target.Tris.Reset(Source.Tris.Num()); + Target.Tris.AddUninitialized(Source.Tris.Num()); + + const FQuantizedTriData* SourceTriData = Source.Tris.GetData(); + + if (Target.Tris.Num() > 0) + { + for (int32 i = 0; i < Target.Tris.Num(); ++i) + { + Target.Tris[i].P1.X = GetDecompressedFloat<10000, 16>(SourceTriData[i].P1[0]); + Target.Tris[i].P1.Y = GetDecompressedFloat<10000, 16>(SourceTriData[i].P1[1]); + Target.Tris[i].P2.X = GetDecompressedFloat<10000, 16>(SourceTriData[i].P2[0]); + Target.Tris[i].P2.Y = GetDecompressedFloat<10000, 16>(SourceTriData[i].P2[1]); + Target.Tris[i].P3.X = GetDecompressedFloat<10000, 16>(SourceTriData[i].P3[0]); + Target.Tris[i].P3.Y = GetDecompressedFloat<10000, 16>(SourceTriData[i].P3[1]); + } + } + + }break; + } + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(Source.OwnerID, 32); + Writer->WriteBits(Source.OperationType, 8); + + switch ((ERenderManagerOperationType)Source.OperationType) + { + case ERenderManagerOperationType::Op_LineDraw: + { + // Color + Writer->WriteBits(Source.Color, 32); + + // Thickness + Writer->WriteBits(Source.Thickness, 32); + + //P 1 1, 20 + //P 2 2, 20 + if (Writer->WriteBool(Source.P1[0] != 0)) {Writer->WriteBits(Source.P1[0], 16);} + if (Writer->WriteBool(Source.P1[1] != 0)) { Writer->WriteBits(Source.P1[1], 16);} + if (Writer->WriteBool(Source.P2[0] != 0)) { Writer->WriteBits(Source.P2[0], 16);} + if (Writer->WriteBool(Source.P2[1] != 0)) { Writer->WriteBits(Source.P2[1], 16);} + + }break; + + case ERenderManagerOperationType::Op_TexDraw: + { + // Texture + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Texture + FNetSerializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.Texture); + ObjSerializer->Serialize(Context, MemberArgsObj); + + // P1 1, 20 + if (Writer->WriteBool(Source.P1[0] != 0)) { Writer->WriteBits(Source.P1[0], 16); } + if (Writer->WriteBool(Source.P1[1] != 0)) { Writer->WriteBits(Source.P1[1], 16); } + + }break; + + case ERenderManagerOperationType::Op_TriDraw: + { + // Color + Writer->WriteBits(Source.Color, 32); + + // Material + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Material + FNetSerializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.Material); + ObjSerializer->Serialize(Context, MemberArgsObj); + + // Tris + const FQuantizedTriData* TargetTriData = Source.Tris.GetData(); + + uint32 TriSize = Source.Tris.Num(); + Writer->WriteBits(TriSize, 32); + + if (Source.Tris.Num() > 0) + { + for (uint32 i = 0; i < Source.Tris.Num(); ++i) + { + Writer->WriteBits(TargetTriData[i].P1[0], 16); + Writer->WriteBits(TargetTriData[i].P1[1], 16); + Writer->WriteBits(TargetTriData[i].P2[0], 16); + Writer->WriteBits(TargetTriData[i].P2[1], 16); + Writer->WriteBits(TargetTriData[i].P3[0], 16); + Writer->WriteBits(TargetTriData[i].P3[1], 16); + } + //Writer->WriteBitStream((uint32*)TargetTriData, 0, (Source.Tris.Num() * sizeof(FQuantizedTriData)) * 8); + } + + }break; + } + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.OwnerID = Reader->ReadBits(32); + Target.OperationType = Reader->ReadBits(8); + + + switch ((ERenderManagerOperationType)Target.OperationType) + { + case ERenderManagerOperationType::Op_LineDraw: + { + // Color + Target.Color = Reader->ReadBits(32); + + // Thickness + Target.Thickness = Reader->ReadBits(32); + + //P 1 1, 20 + //P 2 2, 20 + Target.P1[0] = Reader->ReadBool() ? Reader->ReadBits(16) : 0; + Target.P1[1] = Reader->ReadBool() ? Reader->ReadBits(16) : 0; + Target.P2[0] = Reader->ReadBool() ? Reader->ReadBits(16) : 0; + Target.P2[1] = Reader->ReadBool() ? Reader->ReadBits(16) : 0; + + }break; + + case ERenderManagerOperationType::Op_TexDraw: + { + // Texture + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Texture + FNetDeserializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.Texture); + ObjSerializer->Deserialize(Context, MemberArgsObj); + + // P1 1, 20 + Target.P1[0] = Reader->ReadBool() ? Reader->ReadBits(16) : 0; + Target.P1[1] = Reader->ReadBool() ? Reader->ReadBits(16) : 0; + + }break; + + case ERenderManagerOperationType::Op_TriDraw: + { + // Color + Target.Color = Reader->ReadBits(32); + + // Material + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.Material + FNetDeserializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.Material); + ObjSerializer->Deserialize(Context, MemberArgsObj); + + // Tris + uint32 TriSize = Reader->ReadBits(32); + Target.Tris.AdjustSize(Context, TriSize); + + FQuantizedTriData* TargetTriData = Target.Tris.GetData(); + + if (Target.Tris.Num() > 0) + { + for (uint32 i = 0; i < TriSize; ++i) + { + TargetTriData[i].P1[0] = Reader->ReadBits(16); + TargetTriData[i].P1[1] = Reader->ReadBits(16); + TargetTriData[i].P2[0] = Reader->ReadBits(16); + TargetTriData[i].P2[1] = Reader->ReadBits(16); + TargetTriData[i].P3[0] = Reader->ReadBits(16); + TargetTriData[i].P3[1] = Reader->ReadBits(16); + } + //Reader->ReadBitStream((uint32*)&TargetTriData, (TriSize * sizeof(FQuantizedTriData)) * 8); + } + }break; + } + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + // This struct is never stored, it is only packed and sent once to catch a client up + return false; + } + + static void CloneDynamicState(FNetSerializationContext& Context, const FNetCloneDynamicStateArgs& Args) + { + const QuantizedType* Source = reinterpret_cast(Args.Source); + QuantizedType* Target = reinterpret_cast(Args.Target); + + Target->OwnerID = Source->OwnerID; + Target->OperationType = Source->OperationType; + + + switch ((ERenderManagerOperationType)Target->OperationType) + { + case ERenderManagerOperationType::Op_LineDraw: + { + // Color + Target->Color = Source->Color; + + // Thickness + Target->Thickness = Source->Thickness; + + //P 1 1, 20 + //P 2 2, 20 + Target->P1[0] = Source->P1[0]; + Target->P1[1] = Source->P1[1]; + Target->P2[0] = Source->P2[0]; + Target->P2[1] = Source->P2[1]; + + }break; + + case ERenderManagerOperationType::Op_TexDraw: + { + // Texture + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + FNetCloneDynamicStateArgs ObjMemberArgs = Args; + ObjMemberArgs.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + ObjMemberArgs.Target = NetSerializerValuePointer(&Target->Texture); + ObjMemberArgs.Source = NetSerializerValuePointer(&Source->Texture); + ObjSerializer->CloneDynamicState(Context, ObjMemberArgs); + + // P1 1, 20 + Target->P1[0] = Source->P1[0]; + Target->P1[1] = Source->P1[1]; + + }break; + + case ERenderManagerOperationType::Op_TriDraw: + { + // Color + Target->Color = Source->Color; + + // Material + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + FNetCloneDynamicStateArgs ObjMemberArgs = Args; + ObjMemberArgs.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + ObjMemberArgs.Target = NetSerializerValuePointer(&Target->Material); + ObjMemberArgs.Source = NetSerializerValuePointer(&Source->Material); + ObjSerializer->CloneDynamicState(Context, ObjMemberArgs); + + // Tris + Target->Tris.Clone(Context, Source->Tris); + + }break; + } + } + + static void FreeDynamicState(FNetSerializationContext& Context, const FNetFreeDynamicStateArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Source); + Target.Tris.Free(Context); + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_BPVRReplicatedTextureStore("BPVRReplicatedTextureStore"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPVRReplicatedTextureStore, FBPVRReplicatedTextureStoreNetSerializer); + + FBPVRReplicatedTextureStoreNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPVRReplicatedTextureStore); + } + + void FBPVRReplicatedTextureStoreNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPVRReplicatedTextureStore); + } + + + UE_NET_IMPLEMENT_SERIALIZER(FBPVRReplicatedTextureStoreNetSerializer); + + + + static const FName PropertyNetSerializerRegistry_NAME_RenderManagerOperation("RenderManagerOperation"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_RenderManagerOperation, FRenderManagerOperationNetSerializer); + + FRenderManagerOperationNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_RenderManagerOperation); + } + + void FRenderManagerOperationNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_RenderManagerOperation); + } + + + UE_NET_IMPLEMENT_SERIALIZER(FRenderManagerOperationNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp index d9abaa8..8bba3c3 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Mover/VRMoverComponent.cpp @@ -29,7 +29,7 @@ FLayeredMove_VRMovement::FLayeredMove_VRMovement() DurationMs = -1.0f; } -bool FLayeredMove_VRMovement::IsFinished(float CurrentSimTimeMs) const +bool FLayeredMove_VRMovement::IsFinished(double CurrentSimTimeMs) const { // We never end the VR velocity injection return false; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ParentRelativeAttachmentComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ParentRelativeAttachmentComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ParentRelativeAttachmentComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ParentRelativeAttachmentComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ReplicatedVRCameraComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ReplicatedVRCameraComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ReplicatedVRCameraComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/ReplicatedVRCameraComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.cpp new file mode 100644 index 0000000..1f16c07 --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.cpp @@ -0,0 +1,258 @@ +#include "Serializers/FBPAdvGripPhysicsSettingsNetSerializer.h" +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" + + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FBPAdvGripPhysicsSettings + // ----------------------------------------------------------------------------- + struct FBPAdvGripPhysicsSettingsNetSerializer + { + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FBPAdvGripPhysicsSettingsNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + /** Version is required. */ + static constexpr uint32 Version = 0; + + struct FQuantizedData + { + uint32 bUsePhysicsSettings : 1; + uint32 PhysicsConstraintType : 1; // This only has two elements + uint32 PhysicsGripLocationSettings : 3; // This only has five states + uint32 bTurnOffGravityDuringGrip : 1; + uint32 bSkipSettingSimulating : 1; + uint32 bUseCustomAngularValues : 1; + uint32 Reserved : 25; // pad out to full 32 bits + + // Quantized ranges (0–512 with ~0.01 precision) + uint32 LinearMaxForceCoefficient; + uint32 AngularMaxForceCoefficient; + + float AngularStiffness; + float AngularDamping; + }; + + typedef FBPAdvGripPhysicsSettings SourceType; + typedef FQuantizedData QuantizedType; + typedef FBPAdvGripPhysicsSettingsNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + // Not doing delta, the majority of the time a single bit (bool) controls the serialization of the entirity + + + /** + * Optional. Same as Serialize but where an acked previous state is provided for bitpacking purposes. + * This is implemented by default to do same value optimization, at the cost of a bit. If implemented + * then DeserializeDelta is required. + */ + /*static void SerializeDelta(FNetSerializationContext&, const FNetSerializeDeltaArgs&) + { + + }*/ + + /** + * Optional. Same as Deserialize but where an acked previous state is provided for bitpacking purposes. + * This is implemented by default to do same value optimization, at the cost of a bit. If implemented + * then SerializeDelta is required. + */ + /*static void DeserializeDelta(FNetSerializationContext&, const FNetDeserializeDeltaArgs&) + { + + }*/ + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + // Copy flags + Target.bUsePhysicsSettings = Source.bUsePhysicsSettings; + + if (Target.bUsePhysicsSettings) + { + Target.PhysicsConstraintType = (uint32)Source.PhysicsConstraintType; + Target.PhysicsGripLocationSettings = (uint32)Source.PhysicsGripLocationSettings; + + Target.bTurnOffGravityDuringGrip = Source.bTurnOffGravityDuringGrip; + Target.bSkipSettingSimulating = Source.bSkipSettingSimulating; + + // Quantize forces + Target.LinearMaxForceCoefficient = GetCompressedFloat<512, 17>(Source.LinearMaxForceCoefficient); + Target.AngularMaxForceCoefficient = GetCompressedFloat<512, 17>(Source.AngularMaxForceCoefficient); + + Target.bUseCustomAngularValues = Source.bUseCustomAngularValues; + + if (Target.bUseCustomAngularValues) + { + // Copy angular floats as-is + Target.AngularStiffness = Source.AngularStiffness; + Target.AngularDamping = Source.AngularDamping; + } + } + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bUsePhysicsSettings = Source.bUsePhysicsSettings != 0; + + if (Source.bUsePhysicsSettings) + { + Target.AngularDamping = Source.AngularDamping; + Target.AngularStiffness = Source.AngularStiffness; + Target.bSkipSettingSimulating = Source.bSkipSettingSimulating != 0; + Target.bTurnOffGravityDuringGrip = Source.bTurnOffGravityDuringGrip != 0; + + + Target.PhysicsConstraintType = (EPhysicsGripConstraintType)Source.PhysicsConstraintType; + Target.PhysicsGripLocationSettings = (EPhysicsGripCOMType)Source.PhysicsGripLocationSettings; + + Target.bUseCustomAngularValues = Source.bUseCustomAngularValues != 0; + + if (Target.bUseCustomAngularValues) + { + Target.AngularMaxForceCoefficient = GetDecompressedFloat<512, 17>(Source.AngularMaxForceCoefficient); + Target.LinearMaxForceCoefficient = GetDecompressedFloat<512, 17>(Source.LinearMaxForceCoefficient); + } + } + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBool(Source.bUsePhysicsSettings); + + if (Source.bUsePhysicsSettings) + { + Writer->WriteBits(static_cast(Source.PhysicsGripLocationSettings), 3); + Writer->WriteBits(static_cast(Source.PhysicsConstraintType), 1); + Writer->WriteBool(Source.bTurnOffGravityDuringGrip); + Writer->WriteBool(Source.bSkipSettingSimulating); + + // Compressed floats + Writer->WriteBits(Source.LinearMaxForceCoefficient, 17); + Writer->WriteBits(Source.AngularMaxForceCoefficient, 17); + + Writer->WriteBool(Source.bUseCustomAngularValues); + if (Source.bUseCustomAngularValues) + { + Writer->WriteBits(Source.AngularStiffness, 32); + Writer->WriteBits(Source.AngularDamping, 32); + } + } + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.bUsePhysicsSettings = Reader->ReadBool(); + + if (Target.bUsePhysicsSettings) + { + Target.PhysicsGripLocationSettings = Reader->ReadBits(3); + Target.PhysicsConstraintType = Reader->ReadBits(1); + Target.bTurnOffGravityDuringGrip = Reader->ReadBool(); + Target.bSkipSettingSimulating = Reader->ReadBool(); + + // Decompress floats + Target.LinearMaxForceCoefficient = Reader->ReadBits(17); + Target.AngularMaxForceCoefficient = Reader->ReadBits(17); + + Target.bUseCustomAngularValues = Reader->ReadBool(); + if (Target.bUseCustomAngularValues) + { + Target.AngularStiffness = Reader->ReadBits(32); + Target.AngularDamping = Reader->ReadBits(32); + } + } + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + if (L.bUsePhysicsSettings != R.bUsePhysicsSettings) return false; + if (!L.bUsePhysicsSettings) return true; + + if (L.PhysicsGripLocationSettings != R.PhysicsGripLocationSettings) return false; + if (L.PhysicsConstraintType != R.PhysicsConstraintType) return false; + if (L.bTurnOffGravityDuringGrip != R.bTurnOffGravityDuringGrip) return false; + if (L.bSkipSettingSimulating != R.bSkipSettingSimulating) return false; + + if (!FMath::IsNearlyEqual(L.LinearMaxForceCoefficient, R.LinearMaxForceCoefficient)) return false; + if (!FMath::IsNearlyEqual(L.AngularMaxForceCoefficient, R.AngularMaxForceCoefficient)) return false; + + if (L.bUseCustomAngularValues != R.bUseCustomAngularValues) return false; + + if (L.bUseCustomAngularValues) + { + if (!FMath::IsNearlyEqual(L.AngularStiffness, R.AngularStiffness)) return false; + if (!FMath::IsNearlyEqual(L.AngularDamping, R.AngularDamping)) return false; + } + + return true; + } + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_BPAdvGripPhysicsSettings("BPAdvGripPhysicsSettings"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPAdvGripPhysicsSettings, FBPAdvGripPhysicsSettingsNetSerializer); + + FBPAdvGripPhysicsSettingsNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPAdvGripPhysicsSettings); + } + + void FBPAdvGripPhysicsSettingsNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPAdvGripPhysicsSettings); + } + + /*void FBPAdvGripPhysicsSettingsNetSerializer::FNetSerializerRegistryDelegates::OnPostFreezeNetSerializerRegistry() + { + }*/ + + UE_NET_IMPLEMENT_SERIALIZER(FBPAdvGripPhysicsSettingsNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPSecondaryGripInfoNetSerializer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPSecondaryGripInfoNetSerializer.cpp new file mode 100644 index 0000000..acd5c09 --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPSecondaryGripInfoNetSerializer.cpp @@ -0,0 +1,423 @@ +#include "Serializers/FBPSecondaryGripInfoNetSerializer.h" +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" +#include "Serializers/FTransformNetQuantizeNetSerializer.h" + + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FBPSecondaryGripInfo + // ----------------------------------------------------------------------------- + struct FBPSecondaryGripInfoNetSerializer + { + inline static const FVectorNetQuantize100NetSerializerConfig FTransformQuantizeSerializerConfig; + inline static const FObjectPtrNetSerializerConfig ObjectPtrNetSerializerConfig; + inline static const FNameNetSerializerConfig NameNetSerializerConfig; + + inline static const FNetSerializerConfig* FTransformQuantizeSerializerConfigPtr = &FTransformQuantizeSerializerConfig; + inline static const FNetSerializer* FTransformQuantizeNetSerializerPtr; + + inline static const FNetSerializerConfig* FObjectPtrSerializerConfigPtr = &ObjectPtrNetSerializerConfig; + inline static const FNetSerializer* FObjectPtrNetSerializerPtr; + + inline static const FNetSerializerConfig* FNameSerializerConfigPtr = &NameNetSerializerConfig; + inline static const FNetSerializer* FNameNetSerializerPtr; + + + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FBPSecondaryGripInfoNetSerializer::FTransformQuantizeNetSerializerPtr = &UE_NET_GET_SERIALIZER(FTransformNetQuantizeNetSerializer); + FBPSecondaryGripInfoNetSerializer::FObjectPtrNetSerializerPtr = &UE_NET_GET_SERIALIZER(FObjectPtrNetSerializer); + FBPSecondaryGripInfoNetSerializer::FNameNetSerializerPtr = &UE_NET_GET_SERIALIZER(FNameNetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FBPSecondaryGripInfoNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + /** Version is required. */ + static constexpr uint32 Version = 0; + + struct alignas(8) FQuantizedData + { + uint8 bHasSecondaryAttachment; + FObjectNetSerializerQuantizedReferenceStorage SecondaryAttachment; + FTransformNetQuantizeQuantizedData SecondaryRelativeTransform; + + uint8 bIsSlotGrip; + + alignas(8) uint8 SecondarySlotName[GetNameNetSerializerSafeQuantizedSize()]; + + uint16 LerpToRate; + + // Not Replicated + // SecondaryGripDistance + //EGripLerpState GripLerpState; + //float curLerp; + //FVector LastRelativeLocation; + }; + + typedef FBPSecondaryGripInfo SourceType; + typedef FQuantizedData QuantizedType; + typedef FBPSecondaryGripInfoNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + // TODO: This is actually a struct that could use some delta serialization implementations. + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + static constexpr bool bHasDynamicState = true; + //static constexpr bool bHasCustomNetReference = true; + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.bHasSecondaryAttachment = Source.bHasSecondaryAttachment ? 1 : 0; + + if (Target.bHasSecondaryAttachment) + { + // ObjectPtr + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.SecondaryAttachment + FNetQuantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.SecondaryAttachment); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.SecondaryAttachment); + ObjSerializer->Quantize(Context, MemberArgsObj); + + + // Transform + const FNetSerializer* TransformSerializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* TransformSerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //SecondaryRelativeTransform + FNetQuantizeArgs MemberArgsTransform = Args; + MemberArgsTransform.NetSerializerConfig = NetSerializerConfigParam(TransformSerializerConfig); + MemberArgsTransform.Source = NetSerializerValuePointer(&Source.SecondaryRelativeTransform); + MemberArgsTransform.Target = NetSerializerValuePointer(&Target.SecondaryRelativeTransform); + TransformSerializer->Quantize(Context, MemberArgsTransform); + + Target.bIsSlotGrip = Source.bIsSlotGrip ? 1 : 0; + + // FName + const FNetSerializer* NameSerializer = FNameNetSerializerPtr; + const FNetSerializerConfig* NameSerializerConfig = FNameSerializerConfigPtr; + + //SecondarySlotName + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(NameSerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.SecondarySlotName); + MemberArgs.Target = NetSerializerValuePointer(&Target.SecondarySlotName); + NameSerializer->Quantize(Context, MemberArgs); + } + + // This is 0.0 - 16.0, using compression to get it smaller, 4 bits = max 16 + 1 bit for sign and 7 bits precision for 128 / full 2 digit precision + Target.LerpToRate = GetCompressedFloat<16, 12>(Source.LerpToRate); + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bHasSecondaryAttachment = Source.bHasSecondaryAttachment != 0; + + if (Target.bHasSecondaryAttachment) + { + // ObjectPtr + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.SecondaryAttachment + FNetDequantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.SecondaryAttachment); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.SecondaryAttachment); + ObjSerializer->Dequantize(Context, MemberArgsObj); + + + // Transform + const FNetSerializer* TransformSerializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* TransformSerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //SecondaryRelativeTransform + FNetDequantizeArgs MemberArgsTransform = Args; + MemberArgsTransform.NetSerializerConfig = NetSerializerConfigParam(TransformSerializerConfig); + MemberArgsTransform.Source = NetSerializerValuePointer(&Source.SecondaryRelativeTransform); + MemberArgsTransform.Target = NetSerializerValuePointer(&Target.SecondaryRelativeTransform); + TransformSerializer->Dequantize(Context, MemberArgsTransform); + + Target.bIsSlotGrip = Source.bIsSlotGrip != 0; + + // FName + const FNetSerializer* NameSerializer = FNameNetSerializerPtr; + const FNetSerializerConfig* NameSerializerConfig = FNameSerializerConfigPtr; + + //SecondarySlotName + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(NameSerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.SecondarySlotName); + MemberArgs.Target = NetSerializerValuePointer(&Target.SecondarySlotName); + NameSerializer->Dequantize(Context, MemberArgs); + } + + // This is 0.0 - 16.0, using compression to get it smaller, 4 bits = max 16 + 1 bit for sign and 7 bits precision for 128 / full 2 digit precision + Target.LerpToRate = GetDecompressedFloat<16, 12>(Source.LerpToRate); + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.bHasSecondaryAttachment), 1); + + if (Source.bHasSecondaryAttachment != 0) + { + // ObjectPtr + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.SecondaryAttachment + FNetSerializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.SecondaryAttachment); + ObjSerializer->Serialize(Context, MemberArgsObj); + + + // Transform + const FNetSerializer* TransformSerializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* TransformSerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //SecondaryRelativeTransform + FNetSerializeArgs MemberArgsTransform = Args; + MemberArgsTransform.NetSerializerConfig = NetSerializerConfigParam(TransformSerializerConfig); + MemberArgsTransform.Source = NetSerializerValuePointer(&Source.SecondaryRelativeTransform); + TransformSerializer->Serialize(Context, MemberArgsTransform); + + Writer->WriteBits(static_cast(Source.bIsSlotGrip), 1); + + // FName + const FNetSerializer* NameSerializer = FNameNetSerializerPtr; + const FNetSerializerConfig* NameSerializerConfig = FNameSerializerConfigPtr; + + //SecondarySlotName + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(NameSerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.SecondarySlotName); + NameSerializer->Serialize(Context, MemberArgs); + } + + // This is 0.0 - 16.0, using compression to get it smaller, 4 bits = max 16 + 1 bit for sign and 7 bits precision for 128 / full 2 digit precision + Writer->WriteBits(static_cast(Source.LerpToRate), 12); + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.bHasSecondaryAttachment = Reader->ReadBits(1); + + if (Target.bHasSecondaryAttachment != 0) + { + // ObjectPtr + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //Target.SecondaryAttachment + FNetDeserializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.SecondaryAttachment); + ObjSerializer->Deserialize(Context, MemberArgsObj); + + + // Transform + const FNetSerializer* TransformSerializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* TransformSerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //SecondaryRelativeTransform + FNetDeserializeArgs MemberArgsTransform = Args; + MemberArgsTransform.NetSerializerConfig = NetSerializerConfigParam(TransformSerializerConfig); + MemberArgsTransform.Target = NetSerializerValuePointer(&Target.SecondaryRelativeTransform); + TransformSerializer->Deserialize(Context, MemberArgsTransform); + + Target.bIsSlotGrip = Reader->ReadBits(1); + + // FName + const FNetSerializer* NameSerializer = FNameNetSerializerPtr; + const FNetSerializerConfig* NameSerializerConfig = FNameSerializerConfigPtr; + + //SecondarySlotName + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(NameSerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.SecondarySlotName); + NameSerializer->Deserialize(Context, MemberArgs); + } + + // This is 0.0 - 16.0, using compression to get it smaller, 4 bits = max 16 + 1 bit for sign and 7 bits precision for 128 / full 2 digit precision + Target.LerpToRate = Reader->ReadBits(12); + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + if (L.bHasSecondaryAttachment != R.bHasSecondaryAttachment) return false; + + if (L.bHasSecondaryAttachment) + { + if (L.SecondaryAttachment != R.SecondaryAttachment) return false; + if (!L.SecondaryRelativeTransform.Equals(R.SecondaryRelativeTransform)) return false; + if (L.bIsSlotGrip != R.bIsSlotGrip) return false; + if (L.SecondarySlotName != R.SecondarySlotName) return false; + } + + if (L.LerpToRate != R.LerpToRate) return false; + + return true; + } + } + + static void CloneDynamicState(FNetSerializationContext& Context, const FNetCloneDynamicStateArgs& Args) + { + const QuantizedType* Source = reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + const FNetSerializer* NameSerializer = FNameNetSerializerPtr; + const FNetSerializerConfig* NameSerializerConfig = FNameSerializerConfigPtr; + + FNetCloneDynamicStateArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(NameSerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.SecondarySlotName); + MemberArgs.Source = NetSerializerValuePointer(&Source->SecondarySlotName); + NameSerializer->CloneDynamicState(Context, MemberArgs); + + + + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + FNetCloneDynamicStateArgs ObjMemberArgs = Args; + ObjMemberArgs.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + ObjMemberArgs.Target = NetSerializerValuePointer(&Target.SecondaryAttachment); + ObjMemberArgs.Source = NetSerializerValuePointer(&Source->SecondaryAttachment); + ObjSerializer->CloneDynamicState(Context, MemberArgs); + } + + static void FreeDynamicState(FNetSerializationContext& Context, const FNetFreeDynamicStateArgs& Args) + { + QuantizedType& Source = *reinterpret_cast(Args.Source); + + const FNetSerializer* NameSerializer = FNameNetSerializerPtr; + const FNetSerializerConfig* NameSerializerConfig = FNameSerializerConfigPtr; + + FNetFreeDynamicStateArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(NameSerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.SecondarySlotName); + NameSerializer->FreeDynamicState(Context, MemberArgs); + + + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + FNetFreeDynamicStateArgs ObjMemberArgs = Args; + ObjMemberArgs.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + ObjMemberArgs.Source = NetSerializerValuePointer(&Source.SecondaryAttachment); + ObjSerializer->FreeDynamicState(Context, MemberArgs); + } + + static void Apply(FNetSerializationContext&, const FNetApplyArgs& Args) + { + const SourceType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bHasSecondaryAttachment = Source.bHasSecondaryAttachment; + + if (Target.bHasSecondaryAttachment) + { + Target.SecondaryAttachment = Source.SecondaryAttachment; + Target.SecondaryRelativeTransform = Source.SecondaryRelativeTransform; + Target.bIsSlotGrip = Source.bIsSlotGrip; + Target.SecondarySlotName = Source.SecondarySlotName; + } + else + { + // Clear non repped values + Target.SecondaryAttachment = nullptr; + Target.SecondaryRelativeTransform = FTransform::Identity; + Target.bIsSlotGrip = false; + Target.SecondarySlotName = NAME_None; + } + + Target.LerpToRate = Source.LerpToRate; + + // Not Replicated + // SecondaryGripDistance + //EGripLerpState GripLerpState; + //float curLerp; + //FVector LastRelativeLocation; + } + + /*static void CollectNetReferences(FNetSerializationContext& Context, const FNetCollectReferencesArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + FNetCollectReferencesArgs CollectNetReferencesArgs = Args; + CollectNetReferencesArgs.NetSerializerConfig = FObjectPtrSerializerConfigPtr; + CollectNetReferencesArgs.Source = NetSerializerValuePointer(&Source.SecondaryAttachment); + ObjSerializer->CollectNetReferences(Context, CollectNetReferencesArgs); + }*/ + }; + + + static const FName PropertyNetSerializerRegistry_NAME_BPSecondaryGripInfo("BPSecondaryGripInfo"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPSecondaryGripInfo, FBPSecondaryGripInfoNetSerializer); + + FBPSecondaryGripInfoNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPSecondaryGripInfo); + } + + void FBPSecondaryGripInfoNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPSecondaryGripInfo); + } + + UE_NET_IMPLEMENT_SERIALIZER(FBPSecondaryGripInfoNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPVRComponentPosRepNetSerializer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPVRComponentPosRepNetSerializer.cpp new file mode 100644 index 0000000..0543b4c --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FBPVRComponentPosRepNetSerializer.cpp @@ -0,0 +1,277 @@ +#include "Serializers/FBPVRComponentPosRepNetSerializer.h" +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/Serialization/PackedVectorNetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" + + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FBPVRComponentPosRep + // ----------------------------------------------------------------------------- + struct FBPVRComponentPosRepNetSerializer + { + + inline static const FVectorNetQuantize10NetSerializerConfig Quantize10SerializerConfig; + inline static const FVectorNetQuantize100NetSerializerConfig Quantize100SerializerConfig; + + inline static const FNetSerializerConfig* VectorNetQuantizeNetSerializerConfigs[2] = { &Quantize10SerializerConfig, &Quantize100SerializerConfig}; + inline static const FNetSerializer* VectorNetQuantizeNetSerializers[2] = {}; + + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FBPVRComponentPosRepNetSerializer::VectorNetQuantizeNetSerializers[0] = &UE_NET_GET_SERIALIZER(FVectorNetQuantize10NetSerializer); + FBPVRComponentPosRepNetSerializer::VectorNetQuantizeNetSerializers[1] = &UE_NET_GET_SERIALIZER(FVectorNetQuantize100NetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FBPVRComponentPosRepNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + /** Version is required. */ + static constexpr uint32 Version = 0; + + struct alignas(8) FQuantizedData + { + uint64 Position[4]; // We don't need to store double for tracked device positions, but their forwarded serializer uses it + uint16 Rotation[3]; + + uint8 QuantizationLevel : 1; + uint8 RotationQuantizationLevel : 1; + }; + + typedef FBPVRComponentPosRep SourceType; + typedef FQuantizedData QuantizedType; + typedef FBPVRComponentPosRepNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + // Not doing delta, the majority of the time a single bit (bool) controls the serialization of the entirity + + /** + * Optional. Same as Serialize but where an acked previous state is provided for bitpacking purposes. + * This is implemented by default to do same value optimization, at the cost of a bit. If implemented + * then DeserializeDelta is required. + */ + /*static void SerializeDelta(FNetSerializationContext&, const FNetSerializeDeltaArgs&) + { + + }*/ + + /** + * Optional. Same as Deserialize but where an acked previous state is provided for bitpacking purposes. + * This is implemented by default to do same value optimization, at the cost of a bit. If implemented + * then SerializeDelta is required. + */ + /*static void DeserializeDelta(FNetSerializationContext&, const FNetDeserializeDeltaArgs&) + { + + }*/ + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.QuantizationLevel = (uint8)Source.QuantizationLevel; + Target.RotationQuantizationLevel = (uint8)Source.RotationQuantizationLevel; + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializers[Target.QuantizationLevel] ; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfigs[Target.QuantizationLevel] ; + + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.Position); + MemberArgs.Target = NetSerializerValuePointer(&Target.Position[0]); + Serializer->Quantize(Context, MemberArgs); + + // Manually quantize these + switch (Source.RotationQuantizationLevel) + { + case EVRRotationQuantization::RoundTo10Bits: + { + Target.Rotation[0] = FBPVRComponentPosRep::CompressAxisTo10BitShort(Source.Rotation.Pitch); + Target.Rotation[1] = FBPVRComponentPosRep::CompressAxisTo10BitShort(Source.Rotation.Yaw); + Target.Rotation[2] = FBPVRComponentPosRep::CompressAxisTo10BitShort(Source.Rotation.Roll); + }break; + + case EVRRotationQuantization::RoundToShort: + { + Target.Rotation[0] = FRotator::CompressAxisToShort(Source.Rotation.Pitch); + Target.Rotation[1] = FRotator::CompressAxisToShort(Source.Rotation.Yaw); + Target.Rotation[2] = FRotator::CompressAxisToShort(Source.Rotation.Roll); + }break; + } + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.QuantizationLevel = (EVRVectorQuantization)Source.QuantizationLevel; + Target.RotationQuantizationLevel = (EVRRotationQuantization)Source.RotationQuantizationLevel; + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializers[Source.QuantizationLevel]; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfigs[Source.QuantizationLevel]; + + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.Position[0]); + MemberArgs.Target = NetSerializerValuePointer(&Target.Position); + Serializer->Dequantize(Context, MemberArgs); + + // Manually quantize these + switch (Target.RotationQuantizationLevel) + { + case EVRRotationQuantization::RoundTo10Bits: + { + Target.Rotation.Pitch = FBPVRComponentPosRep::DecompressAxisFrom10BitShort(Source.Rotation[0]); + Target.Rotation.Yaw = FBPVRComponentPosRep::DecompressAxisFrom10BitShort(Source.Rotation[1]); + Target.Rotation.Roll = FBPVRComponentPosRep::DecompressAxisFrom10BitShort(Source.Rotation[2]); + }break; + + case EVRRotationQuantization::RoundToShort: + { + Target.Rotation.Pitch = FRotator::DecompressAxisFromShort(Source.Rotation[0]); + Target.Rotation.Yaw = FRotator::DecompressAxisFromShort(Source.Rotation[1]); + Target.Rotation.Roll = FRotator::DecompressAxisFromShort(Source.Rotation[2]); + }break; + } + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.QuantizationLevel), 1); + Writer->WriteBits(static_cast(Source.RotationQuantizationLevel), 1); + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializers[Source.QuantizationLevel] ; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfigs[Source.QuantizationLevel]; + + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.Position[0]); + Serializer->Serialize(Context, MemberArgs); + + switch ((EVRRotationQuantization)Source.RotationQuantizationLevel) + { + case EVRRotationQuantization::RoundTo10Bits: + { + Writer->WriteBits(static_cast(Source.Rotation[0]), 10); + Writer->WriteBits(static_cast(Source.Rotation[1]), 10); + Writer->WriteBits(static_cast(Source.Rotation[2]), 10); + }break; + + case EVRRotationQuantization::RoundToShort: + { + Writer->WriteBits(static_cast(Source.Rotation[0]), 16); + Writer->WriteBits(static_cast(Source.Rotation[1]), 16); + Writer->WriteBits(static_cast(Source.Rotation[2]), 16); + }break; + } + + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.QuantizationLevel = Reader->ReadBits(1); + Target.RotationQuantizationLevel = Reader->ReadBits(1); + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializers[Target.QuantizationLevel] ; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfigs[Target.QuantizationLevel]; + + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.Position[0]); + Serializer->Deserialize(Context, MemberArgs); + + switch ((EVRRotationQuantization)Target.RotationQuantizationLevel) + { + case EVRRotationQuantization::RoundTo10Bits: + { + Target.Rotation[0] = Reader->ReadBits(10); + Target.Rotation[1] = Reader->ReadBits(10); + Target.Rotation[2] = Reader->ReadBits(10); + }break; + + case EVRRotationQuantization::RoundToShort: + { + Target.Rotation[0] = Reader->ReadBits(16); + Target.Rotation[1] = Reader->ReadBits(16); + Target.Rotation[2] = Reader->ReadBits(16); + }break; + } + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + if (L.QuantizationLevel != R.QuantizationLevel) return false; + if (L.RotationQuantizationLevel != R.RotationQuantizationLevel) return false; + + if (!L.Position.Equals(R.Position)) return false; + if (!L.Rotation.Equals(R.Rotation)) return false; + + return true; + } + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_BPVRComponentPosRep("BPVRComponentPosRep"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPVRComponentPosRep, FBPVRComponentPosRepNetSerializer); + + FBPVRComponentPosRepNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPVRComponentPosRep); + } + + void FBPVRComponentPosRepNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_BPVRComponentPosRep); + } + + /*void FBPVRComponentPosRepNetSerializer::FNetSerializerRegistryDelegates::OnPostFreezeNetSerializerRegistry() + { + }*/ + + UE_NET_IMPLEMENT_SERIALIZER(FBPVRComponentPosRepNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FRepMovementVRNetSerializer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FRepMovementVRNetSerializer.cpp new file mode 100644 index 0000000..9d5261e --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FRepMovementVRNetSerializer.cpp @@ -0,0 +1,402 @@ +#include "Serializers/FRepMovementVRNetSerializer.h" +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/Serialization/PackedVectorNetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" + +#include "VRBaseCharacter.h" +#include "RepMovementNetSerializer.h" + + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FRepMovementVRCharacter + // ----------------------------------------------------------------------------- + struct FRepMovementVRCharacterNetSerializer + { + inline static const FVectorNetQuantize100NetSerializerConfig Quantize100SerializerConfig; + inline static const FRepMovementNetSerializerConfig RepMovementPtrNetSerializerConfig; + + inline static const FNetSerializerConfig* VectorNetQuantizeNetSerializerConfig = &Quantize100SerializerConfig; + inline static const FNetSerializer* VectorNetQuantizeNetSerializer; + + inline static const FNetSerializerConfig* FRepMovementNetSerializerConfig = &RepMovementPtrNetSerializerConfig; + inline static const FNetSerializer* FRepMovementNetSerializer; + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FRepMovementVRCharacterNetSerializer::VectorNetQuantizeNetSerializer = &UE_NET_GET_SERIALIZER(FVectorNetQuantize100NetSerializer); + FRepMovementVRCharacterNetSerializer::FRepMovementNetSerializer = &UE_NET_GET_SERIALIZER(FRepMovementNetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FRepMovementVRCharacterNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + /** Version is required. */ + static constexpr uint32 Version = 0; + + // TODO: Keep up to date with the source struct + // Copy of the rep movement quant data struct, needs to be kept up to date with engine changes + struct FRepMovementQuantizedDataCopy + { + uint64 AngularVelocity[4]; + uint64 LinearVelocity[4]; + uint64 Location[4]; + uint16 Rotation[4]; + uint64 Acceleration[4]; + int32 ServerFrame; + int32 ServerPhysicsHandle; + + uint16 Flags : 4; + uint16 VelocityQuantizationLevel : 2; + uint16 LocationQuantizationLevel : 2; + uint16 RotationQuantizationLevel : 1; + uint16 RepAcceleration : 1; + uint16 Unused : 6; + uint16 Padding[3]; + }; + + struct alignas(8) FRepMovementVRCharacterQuantizedData + { + uint8 bJustTeleported; + uint8 bJustTeleportedGrips; + uint8 bPausedTracking; + uint64 PausedTrackingLoc[4]; + uint16 PausedTrackingRot; + + // Not Replicated, is stored as a reference + //FObjectNetSerializerQuantizedReferenceStorage Owner; + + FRepMovementQuantizedDataCopy RepMovementData; + }; + + typedef FRepMovementVRCharacter SourceType; + typedef FRepMovementVRCharacterQuantizedData QuantizedType; + typedef FRepMovementVRCharacterNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + + // Should likely handle delta custom eventually + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.bJustTeleported = Source.bJustTeleported ? 1 : 0; + Target.bJustTeleportedGrips = Source.bJustTeleportedGrips ? 1 : 0; + + Target.bPausedTracking = Source.bPausedTracking ? 1 : 0; + + if (Source.bPausedTracking) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.PausedTrackingLoc); + MemberArgs.Target = NetSerializerValuePointer(&Target.PausedTrackingLoc[0]); + Serializer->Quantize(Context, MemberArgs); + + Target.PausedTrackingRot = FRotator::CompressAxisToShort(Source.PausedTrackingRot); + } + + // FRepMovementQuantizedDataCopy RepMovementData; + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source); + MemberArgs.Target = NetSerializerValuePointer(&Target.RepMovementData); + Serializer->Quantize(Context, MemberArgs); + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bJustTeleported = Source.bJustTeleported != 0; + Target.bJustTeleportedGrips = Source.bJustTeleportedGrips != 0; + + Target.bPausedTracking = Source.bPausedTracking != 0; + + if (Target.bPausedTracking) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.PausedTrackingLoc[0]); + MemberArgs.Target = NetSerializerValuePointer(&Target.PausedTrackingLoc); + Serializer->Dequantize(Context, MemberArgs); + + Target.PausedTrackingRot = FRotator::DecompressAxisFromShort(Source.PausedTrackingRot); + } + + // FRepMovementQuantizedDataCopy RepMovementData; + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.RepMovementData); + MemberArgs.Target = NetSerializerValuePointer(&Target); + Serializer->Dequantize(Context, MemberArgs); + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.bJustTeleported), 1); + Writer->WriteBits(static_cast(Source.bJustTeleportedGrips), 1); + + Writer->WriteBits(static_cast(Source.bPausedTracking), 1); + + if (Source.bPausedTracking != 0) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.PausedTrackingLoc[0]); + Serializer->Serialize(Context, MemberArgs); + + Writer->WriteBits(static_cast(Source.PausedTrackingRot), 16); + } + + // FRepMovementQuantizedDataCopy RepMovementData; + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.RepMovementData); + Serializer->Serialize(Context, MemberArgs); + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.bJustTeleported = Reader->ReadBits(1); + Target.bJustTeleportedGrips = Reader->ReadBits(1); + + Target.bPausedTracking = Reader->ReadBits(1); + + if (Target.bPausedTracking != 0) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.PausedTrackingLoc[0]); + Serializer->Deserialize(Context, MemberArgs); + + Target.PausedTrackingRot = Reader->ReadBits(16); + } + + // FRepMovementQuantizedDataCopy RepMovementData; + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.RepMovementData); + Serializer->Deserialize(Context, MemberArgs); + } + + static void SerializeDelta(FNetSerializationContext& Context, const FNetSerializeDeltaArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.bJustTeleported), 1); + Writer->WriteBits(static_cast(Source.bJustTeleportedGrips), 1); + + Writer->WriteBits(static_cast(Source.bPausedTracking), 1); + + if (Source.bPausedTracking != 0) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.PausedTrackingLoc[0]); + Serializer->Serialize(Context, MemberArgs); + + Writer->WriteBits(static_cast(Source.PausedTrackingRot), 16); + } + + // FRepMovementQuantizedDataCopy RepMovementData; + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetSerializeDeltaArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.RepMovementData); + Serializer->SerializeDelta(Context, MemberArgs); + + } + + static void DeserializeDelta(FNetSerializationContext& Context, const FNetDeserializeDeltaArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.bJustTeleported = Reader->ReadBits(1); + Target.bJustTeleportedGrips = Reader->ReadBits(1); + + Target.bPausedTracking = Reader->ReadBits(1); + + if (Target.bPausedTracking != 0) + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.PausedTrackingLoc[0]); + Serializer->Deserialize(Context, MemberArgs); + + Target.PausedTrackingRot = Reader->ReadBits(16); + } + + // FRepMovementQuantizedDataCopy RepMovementData; + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetDeserializeDeltaArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.RepMovementData); + Serializer->DeserializeDelta(Context, MemberArgs); + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + if (L.bJustTeleported != R.bJustTeleported) return false; + if (L.bJustTeleportedGrips != R.bJustTeleportedGrips) return false; + if (L.bPausedTracking != R.bPausedTracking) return false; + + if (L.bPausedTracking) + { + if (!L.PausedTrackingLoc.Equals(R.PausedTrackingLoc)) return false; + if (!FMath::IsNearlyEqual(L.PausedTrackingRot, R.PausedTrackingRot)) return false; + } + + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetIsEqualArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source0 = NetSerializerValuePointer(&L); + MemberArgs.Source1 = NetSerializerValuePointer(&R); + return Serializer->IsEqual(Context, MemberArgs); + } + } + + static bool Validate(FNetSerializationContext& Context, const FNetValidateArgs& Args) + { + const SourceType& Source = *reinterpret_cast(Args.Source); + + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetValidateArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source); + return Serializer->Validate(Context, MemberArgs); + } + + static void Apply(FNetSerializationContext& Context, const FNetApplyArgs& Args) + { + const SourceType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + + Target.bJustTeleported = Source.bJustTeleported; + Target.bJustTeleportedGrips = Source.bJustTeleportedGrips; + + Target.bPausedTracking = Source.bPausedTracking; + + if (Target.bPausedTracking) + { + Target.PausedTrackingLoc = Source.PausedTrackingLoc; + Target.PausedTrackingRot = Source.PausedTrackingRot; + } + else + { + Target.PausedTrackingLoc = FVector::ZeroVector; + Target.PausedTrackingRot = 0.0f; + } + + const FNetSerializer* Serializer = FRepMovementNetSerializer; + const FNetSerializerConfig* SerializerConfig = FRepMovementNetSerializerConfig; + + FNetApplyArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source); + MemberArgs.Target = NetSerializerValuePointer(&Target); + Serializer->Apply(Context, MemberArgs); + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_RepMovementVRCharacter("RepMovementVRCharacter"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_RepMovementVRCharacter, FRepMovementVRCharacterNetSerializer); + + FRepMovementVRCharacterNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_RepMovementVRCharacter); + } + + void FRepMovementVRCharacterNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_RepMovementVRCharacter); + } + + UE_NET_IMPLEMENT_SERIALIZER(FRepMovementVRCharacterNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FTransformNetQuantizeNetSerializer.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FTransformNetQuantizeNetSerializer.cpp new file mode 100644 index 0000000..9da40bd --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/Serializers/FTransformNetQuantizeNetSerializer.cpp @@ -0,0 +1,250 @@ +#include "Serializers/FTransformNetQuantizeNetSerializer.h" +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/Serialization/PackedVectorNetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" + +#include "VRBPDatatypes.h" + + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FTransformNetQuantize + // ----------------------------------------------------------------------------- + struct FTransformNetQuantizeNetSerializer + { + inline static const FVectorNetQuantize100NetSerializerConfig Quantize100SerializerConfig; + + inline static const FNetSerializerConfig* VectorNetQuantizeNetSerializerConfig = &Quantize100SerializerConfig; + inline static const FNetSerializer* VectorNetQuantizeNetSerializer; + + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FTransformNetQuantizeNetSerializer::VectorNetQuantizeNetSerializer = &UE_NET_GET_SERIALIZER(FVectorNetQuantize100NetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FTransformNetQuantizeNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + /** Version is required. */ + static constexpr uint32 Version = 0; + + /*struct alignas(8) FQuantizedData + { + uint64 Position[4]; // We don't need to store double for tracked device positions, but their forwarded serializer uses it + uint16 Rotation[3]; + uint64 Scale[4]; // We don't need to store double for tracked device positions, but their forwarded serializer uses it + uint8 UseHighPrecision : 1; + };*/ + + typedef FTransform_NetQuantize SourceType; + typedef FTransformNetQuantizeQuantizedData QuantizedType; + typedef FTransformNetQuantizeNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + + // Should likely handle delta custom eventually + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + static const auto CVarRepHighPrecisionTransforms = IConsoleManager::Get().FindConsoleVariable(TEXT("vrexp.RepHighPrecisionTransforms")); + bool bUseHighPrecision = CVarRepHighPrecisionTransforms->GetBool(); + Target.UseHighPrecision = bUseHighPrecision; + + FVector rTranslation = Source.GetTranslation(); + FVector rScale3D = Source.GetScale3D(); + FRotator rRotation = Source.Rotator(); + + if (bUseHighPrecision) + { + Target.Position[0] = rTranslation.X; + Target.Position[1] = rTranslation.Y; + Target.Position[2] = rTranslation.Z; + + Target.Scale[0] = rScale3D.X; + Target.Scale[1] = rScale3D.Y; + Target.Scale[2] = rScale3D.Z; + + Target.Rotation[0] = FRotator::CompressAxisToShort(rRotation.Pitch); + Target.Rotation[1] = FRotator::CompressAxisToShort(rRotation.Yaw); + Target.Rotation[2] = FRotator::CompressAxisToShort(rRotation.Roll); + } + else + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&rTranslation); + MemberArgs.Target = NetSerializerValuePointer(&Target.Position[0]); + Serializer->Quantize(Context, MemberArgs); + + MemberArgs.Source = NetSerializerValuePointer(&rScale3D); + MemberArgs.Target = NetSerializerValuePointer(&Target.Scale[0]); + Serializer->Quantize(Context, MemberArgs); + + Target.Rotation[0] = FRotator::CompressAxisToShort(rRotation.Pitch); + Target.Rotation[1] = FRotator::CompressAxisToShort(rRotation.Yaw); + Target.Rotation[2] = FRotator::CompressAxisToShort(rRotation.Roll); + } + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + bool bUseHighPrecision = Source.UseHighPrecision != 0; + + FVector rTranslation; + FVector rScale3D; + FRotator rRotation; + + if (bUseHighPrecision) + { + rTranslation.X = Source.Position[0]; + rTranslation.Y = Source.Position[1]; + rTranslation.Z = Source.Position[2]; + + rScale3D.X = Source.Scale[0]; + rScale3D.Y = Source.Scale[1]; + rScale3D.Z = Source.Scale[2]; + + rRotation.Pitch = FRotator::DecompressAxisFromShort(Source.Rotation[0]); + rRotation.Yaw = FRotator::DecompressAxisFromShort(Source.Rotation[1]); + rRotation.Roll = FRotator::DecompressAxisFromShort(Source.Rotation[2]); + } + else + { + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.Position[0]); + MemberArgs.Target = NetSerializerValuePointer(&rTranslation); + Serializer->Dequantize(Context, MemberArgs); + + MemberArgs.Source = NetSerializerValuePointer(&Source.Scale[0]); + MemberArgs.Target = NetSerializerValuePointer(&rScale3D); + Serializer->Dequantize(Context, MemberArgs); + + rRotation.Pitch = FRotator::DecompressAxisFromShort(Source.Rotation[0]); + rRotation.Yaw = FRotator::DecompressAxisFromShort(Source.Rotation[1]); + rRotation.Roll = FRotator::DecompressAxisFromShort(Source.Rotation[2]); + } + + Target.SetComponents(rRotation.Quaternion(), rTranslation, rScale3D); + Target.NormalizeRotation(); + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.UseHighPrecision), 1); + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.Position[0]); + Serializer->Serialize(Context, MemberArgs); + + MemberArgs.Source = NetSerializerValuePointer(&Source.Scale[0]); + Serializer->Serialize(Context, MemberArgs); + + Writer->WriteBits(static_cast(Source.Rotation[0]), 16); + Writer->WriteBits(static_cast(Source.Rotation[1]), 16); + Writer->WriteBits(static_cast(Source.Rotation[2]), 16); + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.UseHighPrecision = Reader->ReadBits(1) != 0; + + const FNetSerializer* Serializer = VectorNetQuantizeNetSerializer; + const FNetSerializerConfig* SerializerConfig = VectorNetQuantizeNetSerializerConfig; + + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.Position[0]); + Serializer->Deserialize(Context, MemberArgs); + + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.Scale[0]); + Serializer->Deserialize(Context, MemberArgs); + + Target.Rotation[0] = Reader->ReadBits(16); + Target.Rotation[1] = Reader->ReadBits(16); + Target.Rotation[2] = Reader->ReadBits(16); + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + if (!L.Equals(R)) return false; + return true; + } + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_TransformNetQuantize("Transform_NetQuantize"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_TransformNetQuantize, FTransformNetQuantizeNetSerializer); + + FTransformNetQuantizeNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_TransformNetQuantize); + } + + void FTransformNetQuantizeNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_TransformNetQuantize); + } + + UE_NET_IMPLEMENT_SERIALIZER(FTransformNetQuantizeNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRAIController.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRAIController.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRAIController.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRAIController.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBPDatatypes.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBPDatatypes.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBPDatatypes.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBPDatatypes.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp similarity index 71% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp index e0b200b..381319d 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacter.cpp @@ -16,6 +16,16 @@ #include "XRMotionControllerBase.h" #include "NavFilters/NavigationQueryFilter.h" #include "Misc/EngineNetworkCustomVersion.h" + + +#include "Serializers/SerializerHelpers.h" +#include "Iris/Serialization/NetSerializerDelegates.h" +#include "Iris/Serialization/NetSerializers.h" +#include "Iris/Serialization/PackedVectorNetSerializers.h" +#include "Iris/ReplicationState/PropertyNetSerializerInfoRegistry.h" +#include "Serializers/FTransformNetQuantizeNetSerializer.h" +//#include "Iris/ReplicationState/ReplicationStateDescriptorBuilder.h" + //#include "Runtime/Engine/Private/EnginePrivate.h" #if WITH_PUSH_MODEL @@ -1354,4 +1364,441 @@ bool FRepMovementVRCharacter::NetSerialize(FArchive& Ar, class UPackageMap* Map, } return true; -} \ No newline at end of file +} + + +// IRIS NET SERIALIZERS + +namespace UE::Net +{ + + // ----------------------------------------------------------------------------- + // Iris serializer for FVRReplicatedCapsuleHeight + // ----------------------------------------------------------------------------- + struct FVRReplicatedCapsuleHeightNetSerializer + { + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FVRReplicatedCapsuleHeightNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + /** Version is required. */ + static constexpr uint32 Version = 0; + + struct alignas(8) FQuantizedData + { + uint32 CompressedFloat; + }; + + typedef FVRReplicatedCapsuleHeight SourceType; + typedef FQuantizedData QuantizedType; + typedef FVRReplicatedCapsuleHeightNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + /** Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. */ + static constexpr bool bUseDefaultDelta = true; + // Not doing delta, the majority of the time a single bit (bool) controls the serialization of the entirity + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.CompressedFloat = GetCompressedFloat<1024, 18>(Source.CapsuleHeight); + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.CapsuleHeight = GetDecompressedFloat<1024, 18>(Source.CompressedFloat); + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.CompressedFloat), 18); + + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.CompressedFloat = Reader->ReadBits(18); + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + return FMath::IsNearlyEqual(L.CapsuleHeight, R.CapsuleHeight); + } + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_FVRReplicatedCapsuleHeight("VRReplicatedCapsuleHeight"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_FVRReplicatedCapsuleHeight, FVRReplicatedCapsuleHeightNetSerializer); + + FVRReplicatedCapsuleHeightNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_FVRReplicatedCapsuleHeight); + } + + void FVRReplicatedCapsuleHeightNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_FVRReplicatedCapsuleHeight); + } + + UE_NET_IMPLEMENT_SERIALIZER(FVRReplicatedCapsuleHeightNetSerializer); + + + // ----------------------------------------------------------------------------- +// Iris serializer for FVRSeatedCharacterInfo +// ----------------------------------------------------------------------------- + struct FVRSeatedCharacterInfoNetSerializer + { + inline static const FVectorNetQuantize100NetSerializerConfig FTransformQuantizeSerializerConfig; + inline static const FObjectPtrNetSerializerConfig ObjectPtrNetSerializerConfig; + + inline static const FNetSerializerConfig* FTransformQuantizeSerializerConfigPtr = &FTransformQuantizeSerializerConfig; + inline static const FNetSerializer* FTransformQuantizeNetSerializerPtr; + + inline static const FNetSerializerConfig* FObjectPtrSerializerConfigPtr = &ObjectPtrNetSerializerConfig; + inline static const FNetSerializer* FObjectPtrNetSerializerPtr; + + class FNetSerializerRegistryDelegates final : private UE::Net::FNetSerializerRegistryDelegates + { + public: + virtual ~FNetSerializerRegistryDelegates(); + + void InitNetSerializer() + { + FVRSeatedCharacterInfoNetSerializer::FTransformQuantizeNetSerializerPtr = &UE_NET_GET_SERIALIZER(FTransformNetQuantizeNetSerializer); + FVRSeatedCharacterInfoNetSerializer::FObjectPtrNetSerializerPtr = &UE_NET_GET_SERIALIZER(FObjectPtrNetSerializer); + } + + private: + virtual void OnPreFreezeNetSerializerRegistry() override; + //virtual void OnPostFreezeNetSerializerRegistry() override; + }; + + inline static FVRSeatedCharacterInfoNetSerializer::FNetSerializerRegistryDelegates NetSerializerRegistryDelegates; + + + // Version is required. + static constexpr uint32 Version = 0; + + struct alignas(8) FQuantizedData + { + uint8 bSitting : 1; + uint8 bZeroToHead : 1; + + FTransformNetQuantizeQuantizedData StoredTargetTransform; + FObjectNetSerializerQuantizedReferenceStorage SeatParent; + uint8 PostSeatedMovementMode; + + // Only if bSitting is true + FTransformNetQuantizeQuantizedData InitialRelCameraTransform; + uint32 AllowedRadius; // Flt 256, 16 + uint32 AllowedRadiusThreshold; // Flt 256, 16 + + //uint8 bIsOverThreshold : 1; // Not Replicated + //uint32 CurrentThresholdScaler; // Not Replicated + }; + + typedef FVRSeatedCharacterInfo SourceType; + typedef FQuantizedData QuantizedType; + typedef FVRSeatedCharacterInfoNetSerializerConfig ConfigType; + inline static const ConfigType DefaultConfig; + + // Set to false when a same value delta compression method is undesirable, for example when the serializer only writes a single bit for the state. + static constexpr bool bUseDefaultDelta = true; + // TODO: This is actually a struct that could use some delta serialization implementations. + + // Called to create a "quantized snapshot" of the struct + static void Quantize(FNetSerializationContext& Context, const FNetQuantizeArgs& Args) + { + // Actually do the real quantization step here next instead of just in serialize, will save on memory overall + const SourceType& Source = *reinterpret_cast(Args.Source); + QuantizedType& Target = *reinterpret_cast(Args.Target); + + Target.bSitting = Source.bSitting; + Target.bZeroToHead = Source.bZeroToHead; + + const FNetSerializer* Serializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* SerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //FTransformNetQuantizeQuantizedData StoredTargetTransform; + FNetQuantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.StoredTargetTransform); + MemberArgs.Target = NetSerializerValuePointer(&Target.StoredTargetTransform); + Serializer->Quantize(Context, MemberArgs); + + + // Only if bSitting is true + //FTransformNetQuantizeQuantizedData InitialRelCameraTransform; + //uint32 AllowedRadius; // Flt 256, 16 + //uint32 AllowedRadiusThreshold; // Flt 256, 16 + + if (Source.bSitting) + { + // Initial relative transform doesn't need to be touched or set if not bsitting + MemberArgs.Source = NetSerializerValuePointer(&Source.InitialRelCameraTransform); + MemberArgs.Target = NetSerializerValuePointer(&Target.InitialRelCameraTransform); + Serializer->Quantize(Context, MemberArgs); + + Target.AllowedRadius = GetCompressedFloat<256,16>(Source.AllowedRadius); + Target.AllowedRadiusThreshold = GetCompressedFloat<256, 16>(Source.AllowedRadiusThreshold); + } + + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //FObjectNetSerializerQuantizedReferenceStorage SeatParent; + FNetQuantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.SeatParent); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.SeatParent); + ObjSerializer->Quantize(Context, MemberArgsObj); + + // Store full 8 bits + Target.PostSeatedMovementMode = (uint8)Source.PostSeatedMovementMode; + } + + // Called to apply the quantized snapshot back to gameplay memory + static void Dequantize(FNetSerializationContext& Context, const FNetDequantizeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bSitting = Source.bSitting != 0; + Target.bZeroToHead = Source.bZeroToHead != 0; + + const FNetSerializer* Serializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* SerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //FTransformNetQuantizeQuantizedData StoredTargetTransform; + FNetDequantizeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.StoredTargetTransform); + MemberArgs.Target = NetSerializerValuePointer(&Target.StoredTargetTransform); + Serializer->Dequantize(Context, MemberArgs); + + + // Only if bSitting is true + //FTransformNetQuantizeQuantizedData InitialRelCameraTransform; + //uint32 AllowedRadius; // Flt 256, 16 + //uint32 AllowedRadiusThreshold; // Flt 256, 16 + + if (Target.bSitting != 0) + { + // Initial relative transform doesn't need to be touched or set if not bsitting + MemberArgs.Source = NetSerializerValuePointer(&Source.InitialRelCameraTransform); + MemberArgs.Target = NetSerializerValuePointer(&Target.InitialRelCameraTransform); + Serializer->Dequantize(Context, MemberArgs); + + Target.AllowedRadius = GetDecompressedFloat<256, 16>(Source.AllowedRadius); + Target.AllowedRadiusThreshold = GetDecompressedFloat<256, 16>(Source.AllowedRadiusThreshold); + } + + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //FObjectNetSerializerQuantizedReferenceStorage SeatParent; + FNetDequantizeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.SeatParent); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.SeatParent); + ObjSerializer->Dequantize(Context, MemberArgsObj); + + // Store full 8 bits + Target.PostSeatedMovementMode = (EVRConjoinedMovementModes)Source.PostSeatedMovementMode; + } + + // Serialize into bitstream + static void Serialize(FNetSerializationContext& Context, const FNetSerializeArgs& Args) + { + const QuantizedType& Source = *reinterpret_cast(Args.Source); + FNetBitStreamWriter* Writer = Context.GetBitStreamWriter(); + + Writer->WriteBits(static_cast(Source.bSitting), 1); + Writer->WriteBits(static_cast(Source.bZeroToHead), 1); + + const FNetSerializer* Serializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* SerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //FTransformNetQuantizeQuantizedData StoredTargetTransform; + FNetSerializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.StoredTargetTransform); + Serializer->Serialize(Context, MemberArgs); + + + if (Source.bSitting != 0) + { + // Initial relative transform doesn't need to be touched or set if not bsitting + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Source = NetSerializerValuePointer(&Source.InitialRelCameraTransform); + Serializer->Serialize(Context, MemberArgs); + + Writer->WriteBits(static_cast(Source.AllowedRadius), 16); + Writer->WriteBits(static_cast(Source.AllowedRadiusThreshold), 16); + } + + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //FObjectNetSerializerQuantizedReferenceStorage SeatParent; + FNetSerializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Source = NetSerializerValuePointer(&Source.SeatParent); + ObjSerializer->Serialize(Context, MemberArgsObj); + + Writer->WriteBits(static_cast(Source.PostSeatedMovementMode), 8); + } + + // Deserialize from bitstream + static void Deserialize(FNetSerializationContext& Context, const FNetDeserializeArgs& Args) + { + QuantizedType& Target = *reinterpret_cast(Args.Target); + FNetBitStreamReader* Reader = Context.GetBitStreamReader(); + + Target.bSitting = Reader->ReadBits(1) != 0; + Target.bZeroToHead = Reader->ReadBits(1) != 0; + + const FNetSerializer* Serializer = FTransformQuantizeNetSerializerPtr; + const FNetSerializerConfig* SerializerConfig = FTransformQuantizeSerializerConfigPtr; + + //FTransformNetQuantizeQuantizedData StoredTargetTransform; + FNetDeserializeArgs MemberArgs = Args; + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.StoredTargetTransform); + Serializer->Deserialize(Context, MemberArgs); + + + if (Target.bSitting != 0) + { + // Initial relative transform doesn't need to be touched or set if not bsitting + MemberArgs.NetSerializerConfig = NetSerializerConfigParam(SerializerConfig); + MemberArgs.Target = NetSerializerValuePointer(&Target.InitialRelCameraTransform); + Serializer->Deserialize(Context, MemberArgs); + + Target.AllowedRadius = Reader->ReadBits(16); + Target.AllowedRadiusThreshold = Reader->ReadBits(16); + } + + const FNetSerializer* ObjSerializer = FObjectPtrNetSerializerPtr; + const FNetSerializerConfig* ObjSerializerConfig = FObjectPtrSerializerConfigPtr; + + //FObjectNetSerializerQuantizedReferenceStorage SeatParent; + FNetDeserializeArgs MemberArgsObj = Args; + MemberArgsObj.NetSerializerConfig = NetSerializerConfigParam(ObjSerializerConfig); + MemberArgsObj.Target = NetSerializerValuePointer(&Target.SeatParent); + ObjSerializer->Deserialize(Context, MemberArgsObj); + + Target.PostSeatedMovementMode = Reader->ReadBits(8); + } + + // Compare two instances to see if they differ + static bool IsEqual(FNetSerializationContext& Context, const FNetIsEqualArgs& Args) + { + if (Args.bStateIsQuantized) + { + const QuantizedType& QuantizedValue0 = *reinterpret_cast(Args.Source0); + const QuantizedType& QuantizedValue1 = *reinterpret_cast(Args.Source1); + return FPlatformMemory::Memcmp(&QuantizedValue0, &QuantizedValue1, sizeof(QuantizedType)) == 0; + } + else + { + const SourceType& L = *reinterpret_cast(Args.Source0); + const SourceType& R = *reinterpret_cast(Args.Source1); + + if (L.bSitting != R.bSitting) return false; + if (L.SeatParent != R.SeatParent) return false; + if(!FMath::IsNearlyEqual(L.AllowedRadius, R.AllowedRadius)) return false; + if (!FMath::IsNearlyEqual(L.AllowedRadiusThreshold, R.AllowedRadiusThreshold)) return false; + if (L.bZeroToHead != R.bZeroToHead) return false; + if (!L.StoredTargetTransform.Equals(R.StoredTargetTransform)) return false; + + if (L.bSitting && !L.InitialRelCameraTransform.Equals(R.InitialRelCameraTransform)) return false; + + return true; + } + } + + static void Apply(FNetSerializationContext&, const FNetApplyArgs& Args) + { + const SourceType& Source = *reinterpret_cast(Args.Source); + SourceType& Target = *reinterpret_cast(Args.Target); + + Target.bSitting = Source.bSitting; + Target.bZeroToHead = Source.bZeroToHead; + Target.StoredTargetTransform = Source.StoredTargetTransform; + + if (Target.bSitting) + { + Target.InitialRelCameraTransform = Source.InitialRelCameraTransform; + Target.AllowedRadius = Source.AllowedRadius; + Target.AllowedRadiusThreshold = Source.AllowedRadiusThreshold; + } + else + { + // Clear non repped values + Target.InitialRelCameraTransform = FTransform::Identity; + Target.AllowedRadius = 0.0f; + Target.AllowedRadiusThreshold = 0.0f; + } + + Target.SeatParent = Source.SeatParent; + Target.PostSeatedMovementMode = Source.PostSeatedMovementMode; + } + }; + + + static const FName PropertyNetSerializerRegistry_NAME_FVRSeatedCharacterInfo("VRSeatedCharacterInfo"); + UE_NET_IMPLEMENT_NAMED_STRUCT_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_FVRSeatedCharacterInfo, FVRSeatedCharacterInfoNetSerializer); + + FVRSeatedCharacterInfoNetSerializer::FNetSerializerRegistryDelegates::~FNetSerializerRegistryDelegates() + { + UE_NET_UNREGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_FVRSeatedCharacterInfo); + } + + void FVRSeatedCharacterInfoNetSerializer::FNetSerializerRegistryDelegates::OnPreFreezeNetSerializerRegistry() + { + InitNetSerializer(); + UE_NET_REGISTER_NETSERIALIZER_INFO(PropertyNetSerializerRegistry_NAME_FVRSeatedCharacterInfo); + } + + UE_NET_IMPLEMENT_SERIALIZER(FVRSeatedCharacterInfoNetSerializer); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacterMovementComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacterMovementComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacterMovementComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRBaseCharacterMovementComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacter.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacter.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacter.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacter.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp index 4ca1ff7..c32c9e5 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRCharacterMovementComponent.cpp @@ -919,6 +919,12 @@ void UVRCharacterMovementComponent::PhysWalking(float deltaTime, int32 Iteration const float timeTick = GetSimulationTimeStep(remainingTime, Iterations); remainingTime -= timeTick; +#if UE_WITH_REMOTE_OBJECT_HANDLE + //Scale down impact force if CharacterMoveComponent is taking multiple substeps. + const float LastFrameDt = GetWorld()->GetDeltaSeconds(); + PhysicsForceSubsteppingFactor = timeTick / LastFrameDt; +#endif + // Save current values UPrimitiveComponent * const OldBase = GetMovementBase(); const FVector PreviousBaseLocation = (OldBase != NULL) ? OldBase->GetComponentLocation() : FVector::ZeroVector; @@ -3223,8 +3229,8 @@ void UVRCharacterMovementComponent::PhysNavWalking(float deltaTime, int32 Iterat Acceleration = ProjectToGravityFloor(Acceleration); //if (!HasRootMotion()) //{ - CalcVelocity(deltaTime, GroundFriction, false, BrakingDecelerationWalking); - devCodeVR(ensureMsgf(!Velocity.ContainsNaN(), TEXT("PhysNavWalking: Velocity contains NaN after CalcVelocity (%s)\n%s"), *GetPathNameSafe(this), *Velocity.ToString())); + CalcVelocity(deltaTime, GroundFriction, false, BrakingDecelerationWalking); + devCodeVR(ensureMsgf(!Velocity.ContainsNaN(), TEXT("PhysNavWalking: Velocity contains NaN after CalcVelocity (%s)\n%s"), *GetPathNameSafe(this), *Velocity.ToString())); //} ApplyRootMotionToVelocity(deltaTime); @@ -3270,7 +3276,7 @@ void UVRCharacterMovementComponent::PhysNavWalking(float deltaTime, int32 Iterat if (bDeltaMoveNearlyZero && bSameNavLocation) { - if (const INavigationDataInterface * NavData = GetNavData()) + if (const INavigationDataInterface* NavData = GetNavData()) { if (!NavData->IsNodeRefValid(CachedNavLocation.NodeRef)) { @@ -3281,6 +3287,7 @@ void UVRCharacterMovementComponent::PhysNavWalking(float deltaTime, int32 Iterat } } + if (bDeltaMoveNearlyZero && bSameNavLocation) { DestNavLocation = CachedNavLocation; @@ -3298,9 +3305,51 @@ void UVRCharacterMovementComponent::PhysNavWalking(float deltaTime, int32 Iterat SetGravitySpaceZ(AdjustedDest, GetGravitySpaceZ(CachedNavLocation.Location)); } - // Find the point on the NavMesh - const bool bHasNavigationData = FindNavFloor(AdjustedDest, DestNavLocation); - if (!bHasNavigationData) + bool bFoundPointOnNavMesh = false; + if (bSlideAlongNavMeshEdge) + { + if (const INavigationDataInterface* NavDataInterface = GetNavData()) + { + const IPathFollowingAgentInterface* PathFollowingAgent = GetPathFollowingAgent(); + const bool bIsOnNavLink = PathFollowingAgent && PathFollowingAgent->IsFollowingNavLink(); + + if (!bIsOnNavLink) + { + FNavLocation StartingNavFloorLocation; + bool bHasValidCachedNavLocation = NavDataInterface->IsNodeRefValid(CachedNavLocation.NodeRef); + + // If we don't have a valid CachedNavLocation lets try finding the NavFloor where we're currently at and use that + if (!bHasValidCachedNavLocation) + { + bHasValidCachedNavLocation = FindNavFloor(OldLocation, OUT StartingNavFloorLocation); + } + else + { + StartingNavFloorLocation = CachedNavLocation; + } + + if (bHasValidCachedNavLocation) + { + bFoundPointOnNavMesh = NavDataInterface->FindMoveAlongSurface(StartingNavFloorLocation, AdjustedDest, OUT DestNavLocation); + + if (bFoundPointOnNavMesh) + { + AdjustedDest = ProjectToGravityFloor(DestNavLocation.Location) + GetGravitySpaceComponentZ(AdjustedDest); + } + } + } + else + { + bFoundPointOnNavMesh = FindNavFloor(AdjustedDest, DestNavLocation); + } + } + } + else + { + bFoundPointOnNavMesh = FindNavFloor(AdjustedDest, DestNavLocation); + } + + if (!bFoundPointOnNavMesh) { RestorePreAdditiveVRMotionVelocity(); SetMovementMode(MOVE_Walking); @@ -3329,7 +3378,7 @@ void UVRCharacterMovementComponent::PhysNavWalking(float deltaTime, int32 Iterat // 4.16 UNCOMMENT FHitResult HitResult; SafeMoveUpdatedComponent(AdjustedDelta, UpdatedComponent->GetComponentQuat(), bSweepWhileNavWalking, HitResult); - + /* 4.16 Delete*/ //const bool bSweep = UpdatedPrimitive ? UpdatedPrimitive->bGenerateOverlapEvents : false; //FHitResult HitResult; @@ -3354,6 +3403,7 @@ void UVRCharacterMovementComponent::PhysNavWalking(float deltaTime, int32 Iterat RestorePreAdditiveVRMotionVelocity(); } + void UVRCharacterMovementComponent::PhysSwimming(float deltaTime, int32 Iterations) { if (deltaTime < MIN_TICK_TIME) diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionFunctionLibrary.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionFunctionLibrary.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionFunctionLibrary.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionFunctionLibrary.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPlugin.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPlugin.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPlugin.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPlugin.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPluginPrivatePCH.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPluginPrivatePCH.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPluginPrivatePCH.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRExpansionPluginPrivatePCH.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGestureComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGestureComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGestureComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGestureComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGlobalSettings.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGlobalSettings.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGlobalSettings.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGlobalSettings.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGripInterface.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGripInterface.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGripInterface.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRGripInterface.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPathFollowingComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPathFollowingComponent.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPathFollowingComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPathFollowingComponent.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPlayerController.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPlayerController.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPlayerController.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRPlayerController.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRRootComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRRootComponent.cpp similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRRootComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRRootComponent.cpp index adda839..226f4df 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRRootComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRRootComponent.cpp @@ -1374,7 +1374,7 @@ bool UVRRootComponent::UpdateOverlapsImpl(const TOverlapArrayView* NewPendingOve const bool bCheckOverlapFlags = false; // Already checked above if (!ShouldIgnoreOverlapResult(MyWorld, MyActor, *this, Result.OverlapObjectHandle.FetchActor(), *HitComp, bCheckOverlapFlags)) { - OverlapMultiResult.Emplace(HitComp, Result.ItemIndex); // don't need to add unique unless the overlap check can return dupes + OverlapMultiResult.Emplace(HitComp, Result.GetItemIndex()); // don't need to add unique unless the overlap check can return dupes } } } diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp index cd82855..1decbd7 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRStereoWidgetComponent.cpp @@ -728,6 +728,15 @@ void UVRStereoWidgetComponent::TickComponent(float DeltaTime, enum ELevelTick Ti }*/ } + // Implement the correct facing stereo layers cvar option + static const auto CVarXRUseLegacyFacing = IConsoleManager::Get().FindConsoleVariable(TEXT("XR.StereoLayers.UseLegacyFacing")); + if (!CVarXRUseLegacyFacing->GetBool()) + { + // The default Open Xr Stereo layer object faces the camera at no rotation where as the unreal object faces away from it at zero rotation + LayerDsec.Transform.SetRotation(Transform.GetRotation() * FQuat(0., 0., 1., 0.)); + } + + if (RenderTarget) { // TODO 5.7 need to figure out how to replace this in some way that isn't so fing slow @@ -888,7 +897,7 @@ public: if (MaterialInstance) { - MaterialRelevance = MaterialInstance->GetRelevance(GetScene().GetFeatureLevel()); + MaterialRelevance = MaterialInstance->GetRelevance(GetScene().GetShaderPlatform()); } } diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRTrackedParentInterface.cpp b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRTrackedParentInterface.cpp similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRTrackedParentInterface.cpp rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Private/VRTrackedParentInterface.cpp diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/CharacterMovementCompTypes.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/CharacterMovementCompTypes.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/CharacterMovementCompTypes.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/CharacterMovementCompTypes.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h index 2cb7d90..516305f 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripMotionControllerComponent.h @@ -1207,6 +1207,18 @@ public: float NewStiffness, float NewDamping, bool bAlsoSetAngularValues = false, float OptionalAngularStiffness = 0.0f, float OptionalAngularDamping = 0.0f ); + // Set the grips advanced settings, may need to recreate grip locally if altering something important (non owning clients will always re-create the grip) + // Can check HasGripAuthority to decide if callable locally + UFUNCTION(BlueprintCallable, Category = "GripMotionController", meta = (ExpandEnumAsExecs = "Result")) + void SetGripAdvancedGripSettings( + const FBPActorGripInformation& Grip, + EBPVRResultSwitch& Result, + uint8 GripPriority = 0, + bool bSetOwnerOnGrip = true, + bool bDisallowLerping = false, + bool bDisallowSettingPositionOnClientAuthDrop = false + ); + // Used to convert an offset transform to grip relative, useful for storing an initial offset and then lerping back to 0 without re-calculating every tick UFUNCTION(BlueprintPure, Category = "GripMotionController", meta = (DisplayName = "CreateGripRelativeAdditionTransform")) FTransform CreateGripRelativeAdditionTransform_BP( diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Default.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Default.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Default.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Default.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_GunTools.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_GunTools.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_GunTools.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_GunTools.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_InteractibleSettings.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_InteractibleSettings.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_InteractibleSettings.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_InteractibleSettings.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_LerpToHand.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_LerpToHand.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_LerpToHand.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_LerpToHand.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Melee.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Melee.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Melee.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Melee.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Physics.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Physics.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Physics.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/GS_Physics.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/VRGripScriptBase.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/VRGripScriptBase.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/VRGripScriptBase.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/GripScripts/VRGripScriptBase.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h index 75df06f..9419b0e 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableActor.h @@ -56,7 +56,6 @@ public: TArray>& GetGripLogicScripts(); bool ReplicateSubobjects(UActorChannel* Channel, class FOutBunch *Bunch, FReplicationFlags *RepFlags) override; - virtual void GetSubobjectsWithStableNamesForNetworking(TArray& ObjList) override; // Sets the Deny Gripping variable on the FBPInterfaceSettings struct UFUNCTION(BlueprintCallable, Category = "VRGripInterface") diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableBoxComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableBoxComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableBoxComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableBoxComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCapsuleComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCapsuleComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCapsuleComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCapsuleComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCharacter.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCharacter.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCharacter.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableCharacter.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h similarity index 81% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h index 53d3216..00fccca 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableDataTypes.h @@ -17,12 +17,13 @@ public: UPROPERTY() bool bIsWelded; - bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess); + // Not really needed, removing it makes sure Iris will just work + //bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess); FRepAttachmentWithWeld(); }; -template<> +/*template<> struct TStructOpsTypeTraits< FRepAttachmentWithWeld > : public TStructOpsTypeTraitsBase2 { enum @@ -31,3 +32,4 @@ struct TStructOpsTypeTraits< FRepAttachmentWithWeld > : public TStructOpsTypeTra //WithNetSharedSerialization = true, }; }; +*/ diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h similarity index 96% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h index 7cd101f..af202ca 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippablePhysicsReplication.h @@ -57,20 +57,23 @@ class FPhysicsReplicationAsyncVR : public IPhysicsReplicationAsync, virtual bool ResimulationReplication(Chaos::FPBDRigidParticleHandle* Handle, FReplicatedPhysicsTargetAsync& Target, const float DeltaSeconds); public: - virtual void RegisterSettings(Chaos::FConstPhysicsObjectHandle PhysicsObject, FNetworkPhysicsSettingsAsync InSettings) override; + virtual void RegisterSettings(Chaos::FConstPhysicsObjectHandle PhysicsObject, TWeakPtr InSettings) override; private: float LatencyOneWay; FRigidBodyErrorCorrection ErrorCorrectionDefault; - FNetworkPhysicsSettingsAsync SettingsCurrent; - FNetworkPhysicsSettingsAsync SettingsDefault; + FNetworkPhysicsSettingsData SettingsCurrent; + FNetworkPhysicsSettingsData SettingsDefault; TMap ObjectToTarget; - TMap ObjectToSettings; + TMap> ObjectToSettings; TArray ResimIslands; TArray ResimIslandsParticles; TArray ParticlesInResimIslands; TArray ReplicatedParticleIDs; + int32 ResimOutOfBoundsCounter = 0; + float ResimErrorLogTimer = 0.0f; + private: FReplicatedPhysicsTargetAsync* AddObjectToReplication(Chaos::FConstPhysicsObjectHandle PhysicsObject); void RemoveObjectFromReplication(Chaos::FConstPhysicsObjectHandle PhysicsObject); diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h index 85e87a6..b3bad64 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshActor.h @@ -79,12 +79,12 @@ public: void SetReplicateGripScripts(bool NewReplicateGripScripts); inline bool GetReplicateGripScripts() { return bReplicateGripScripts; }; + // Get the grip script array, will automatically dirty it if they are replicated as it is assumed if you are directly accessing it you are altering it TArray>& GetGripLogicScripts(); bool ReplicateSubobjects(UActorChannel* Channel, class FOutBunch* Bunch, FReplicationFlags* RepFlags) override; - virtual void GetSubobjectsWithStableNamesForNetworking(TArray& ObjList) override; // Sets the Deny Gripping variable on the FBPInterfaceSettings struct UFUNCTION(BlueprintCallable, Category = "VRGripInterface") diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSkeletalMeshComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSphereComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSphereComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSphereComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableSphereComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h index 986c521..f330a39 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshActor.h @@ -80,7 +80,6 @@ public: TArray>& GetGripLogicScripts(); bool ReplicateSubobjects(UActorChannel* Channel, class FOutBunch *Bunch, FReplicationFlags *RepFlags) override; - virtual void GetSubobjectsWithStableNamesForNetworking(TArray& ObjList) override; // Sets the Deny Gripping variable on the FBPInterfaceSettings struct UFUNCTION(BlueprintCallable, Category = "VRGripInterface") diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/GrippableStaticMeshComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/HandSocketComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/HandSocketComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/HandSocketComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Grippables/HandSocketComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRButtonComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRButtonComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRButtonComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRButtonComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRDialComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRDialComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRDialComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRDialComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRInteractibleFunctionLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRInteractibleFunctionLibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRInteractibleFunctionLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRInteractibleFunctionLibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRLeverComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRLeverComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRLeverComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRLeverComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRMountComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRMountComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRMountComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRMountComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRSliderComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRSliderComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRSliderComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Interactibles/VRSliderComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/BucketUpdateSubsystem.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/BucketUpdateSubsystem.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/BucketUpdateSubsystem.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/BucketUpdateSubsystem.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/CollisionIgnoreSubsystem.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/CollisionIgnoreSubsystem.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/CollisionIgnoreSubsystem.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/CollisionIgnoreSubsystem.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/OptionalRepSkeletalMeshActor.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/OptionalRepSkeletalMeshActor.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/OptionalRepSkeletalMeshActor.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/OptionalRepSkeletalMeshActor.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRAIPerceptionOverrides.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRAIPerceptionOverrides.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRAIPerceptionOverrides.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRAIPerceptionOverrides.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicalAnimationComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicalAnimationComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicalAnimationComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicalAnimationComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicsConstraintComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicsConstraintComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicsConstraintComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VREPhysicsConstraintComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRFullScreenUserWidget.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRFullScreenUserWidget.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRFullScreenUserWidget.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRFullScreenUserWidget.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRGameViewportClient.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRGameViewportClient.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRGameViewportClient.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRGameViewportClient.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h index 970d987..cc483d4 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRLogComponent.h @@ -67,7 +67,8 @@ public: bIsDirty = false; MaxStoredMessages = 1000; GLog->AddOutputDevice(this); - GLog->SerializeBacklog(this); + // Deprecated. Do nothing because AddOutputDevice now serializes the backlog. + //GLog->SerializeBacklog(this); } ~FVROutputLogHistory() diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRPlayerStart.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRPlayerStart.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRPlayerStart.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRPlayerStart.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h similarity index 95% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h index 696817e..de6fcff 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRRenderTargetManager.h @@ -3,6 +3,7 @@ #include "GameFramework/Actor.h" #include "Components/ActorComponent.h" #include "Containers/Queue.h" +#include "Iris/Serialization/NetSerializer.h" #include "VRRenderTargetManager.generated.h" class UVRRenderTargetManager; @@ -385,3 +386,22 @@ protected: TQueue RenderDataQueue; }; + + +USTRUCT() +struct FBPVRReplicatedTextureStoreSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +USTRUCT() +struct FRenderManagerOperationSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FBPVRReplicatedTextureStoreNetSerializer, VREXPANSIONPLUGIN_API); + UE_NET_DECLARE_SERIALIZER(FRenderManagerOperationNetSerializer, VREXPANSIONPLUGIN_API); +} diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRVehiclePawn.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRVehiclePawn.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRVehiclePawn.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRVehiclePawn.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRWheeledVehicle.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRWheeledVehicle.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRWheeledVehicle.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Misc/VRWheeledVehicle.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h index 687b613..575ebaf 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Mover/VRMoverComponent.h @@ -36,7 +36,7 @@ struct VREXPANSIONPLUGIN_API FLayeredMove_VRMovement : public FLayeredMoveBase uint8 SettingsFlags; // Never finish this movement - virtual bool IsFinished(float CurrentSimTimeMs) const; + virtual bool IsFinished(double CurrentSimTimeMs) const; // Generate a movement virtual bool GenerateMove(const FMoverTickStartData& StartState, const FMoverTimeStep& TimeStep, const UMoverComponent* MoverComp, UMoverBlackboard* SimBlackboard, FProposedMove& OutProposedMove) override; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ParentRelativeAttachmentComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ParentRelativeAttachmentComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ParentRelativeAttachmentComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ParentRelativeAttachmentComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ReplicatedVRCameraComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ReplicatedVRCameraComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ReplicatedVRCameraComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/ReplicatedVRCameraComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.h new file mode 100644 index 0000000..5808874 --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPAdvGripPhysicsSettingsNetSerializer.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Iris/Serialization/NetSerializer.h" +#include "VRBPDatatypes.h" + +#include "FBPAdvGripPhysicsSettingsNetSerializer.generated.h" + +USTRUCT() +struct FBPAdvGripPhysicsSettingsNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FBPAdvGripPhysicsSettingsNetSerializer, VREXPANSIONPLUGIN_API); +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPSecondaryGripInfoNetSerializer.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPSecondaryGripInfoNetSerializer.h new file mode 100644 index 0000000..2d43145 --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPSecondaryGripInfoNetSerializer.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Iris/Serialization/NetSerializer.h" +#include "VRBPDatatypes.h" + +#include "FBPSecondaryGripInfoNetSerializer.generated.h" + +USTRUCT() +struct FBPSecondaryGripInfoNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FBPSecondaryGripInfoNetSerializer, VREXPANSIONPLUGIN_API); +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPVRComponentPosRepNetSerializer.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPVRComponentPosRepNetSerializer.h new file mode 100644 index 0000000..a009509 --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FBPVRComponentPosRepNetSerializer.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Iris/Serialization/NetSerializer.h" +#include "VRBPDatatypes.h" + +#include "FBPVRComponentPosRepNetSerializer.generated.h" + +USTRUCT() +struct FBPVRComponentPosRepNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FBPVRComponentPosRepNetSerializer, VREXPANSIONPLUGIN_API); +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FRepMovementVRNetSerializer.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FRepMovementVRNetSerializer.h new file mode 100644 index 0000000..35b001e --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FRepMovementVRNetSerializer.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Iris/Serialization/NetSerializer.h" + +#include "FRepMovementVRNetSerializer.generated.h" + +USTRUCT() +struct FRepMovementVRCharacterNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FRepMovementVRCharacterNetSerializer, VREXPANSIONPLUGIN_API); + +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FTransformNetQuantizeNetSerializer.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FTransformNetQuantizeNetSerializer.h new file mode 100644 index 0000000..58f6a4d --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/FTransformNetQuantizeNetSerializer.h @@ -0,0 +1,26 @@ +#pragma once + +#include "Iris/Serialization/NetSerializer.h" +#include "VRBPDatatypes.h" + +#include "FTransformNetQuantizeNetSerializer.generated.h" + +USTRUCT() +struct FTransformNetQuantizeNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FTransformNetQuantizeNetSerializer, VREXPANSIONPLUGIN_API); + + + struct alignas(8) FTransformNetQuantizeQuantizedData + { + uint64 Position[4]; // We don't need to store double for tracked device positions, but their forwarded serializer uses it + uint16 Rotation[3]; + uint64 Scale[4]; // We don't need to store double for tracked device positions, but their forwarded serializer uses it + uint8 UseHighPrecision : 1; + }; +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/SerializerHelpers.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/SerializerHelpers.h new file mode 100644 index 0000000..2fdebcf --- /dev/null +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/Serializers/SerializerHelpers.h @@ -0,0 +1,144 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/NetSerialization.h" + +// Helpers for Iris serialization + + + + +namespace UE::Net +{ + // ----------------------------------------------------------------------------- + // Fixed-compression helpers for 0–MaxValue floats with BitCount precision + // Epic doesn't have per float compression helpers yet for Iris serializers + // ----------------------------------------------------------------------------- + + // Based on Epics FixedCompressionFloat functions for std archives + + template + uint32 GetCompressedFloat(const float Value) + { + using Details = TFixedCompressedFloatDetails; + + bool clamp = false; + int64 ScaledValue; + if (MaxValue > Details::MaxBitValue) + { + // We have to scale this down + const float Scale = float(Details::MaxBitValue) / MaxValue; + ScaledValue = FMath::TruncToInt(Scale * Value); + } + else + { + // We will scale up to get extra precision. But keep is a whole number preserve whole values + constexpr int32 Scale = Details::MaxBitValue / MaxValue; + ScaledValue = FMath::RoundToInt(Scale * Value); + } + + uint32 Delta = static_cast(ScaledValue + Details::Bias); + + if (Delta > Details::MaxDelta) + { + clamp = true; + Delta = static_cast(Delta) > 0 ? Details::MaxDelta : 0; + } + + return Delta; + } + + template + float GetDecompressedFloat(uint32 Delta) + { + using Details = TFixedCompressedFloatDetails; + + float Value = 0.0f; + + float UnscaledValue = static_cast(static_cast(Delta) - Details::Bias); + + if constexpr (MaxValue > Details::MaxBitValue) + { + // We have to scale down, scale needs to be a float: + constexpr float InvScale = MaxValue / (float)Details::MaxBitValue; + Value = UnscaledValue * InvScale; + } + else + { + constexpr int32 Scale = Details::MaxBitValue / MaxValue; + constexpr float InvScale = float(1) / (float)Scale; + + Value = UnscaledValue * InvScale; + } + + return Value; + } + + template + bool WritePackedIrisFloat2(float X, float Y, FNetBitStreamWriter* Ar) // Note Value is intended to not be a reference since we are scaling it before serializing! + { + FVector2D Value(X, Y); + + // Scale vector by quant factor first + Value[0] *= ScaleFactor; + Value[1] *= ScaleFactor; + + float MinV = -1073741824.0f; + float MaxV = 1073741760.0f; + + // Some platforms have RoundToInt implementations that essentially reduces the allowed inputs to 2^31. + const FVector2D ClampedValue = FVector2D(FMath::Clamp(Value.X, MinV, MaxV), FMath::Clamp(Value.Y, MinV, MaxV)); + bool bClamp = ClampedValue != Value; + + // Do basically FVector::SerializeCompressed + int32 IntX = FMath::RoundToInt(ClampedValue.X); + int32 IntY = FMath::RoundToInt(ClampedValue.Y); + + uint32 Bits = FMath::Clamp(FMath::CeilLogTwo(1 + FMath::Max(FMath::Abs(IntX), FMath::Abs(IntY))), 1, MaxBitsPerComponent) - 1; + + // Serialize how many bits each component will have + Ar->WriteBits(Bits, MaxBitsPerComponent); + //Ar.SerializeInt(Bits, MaxBitsPerComponent); + + int32 Bias = 1 << (Bits + 1); + uint32 Max = 1 << (Bits + 2); + uint32 DX = IntX + Bias; + uint32 DY = IntY + Bias; + + if (DX >= Max) { bClamp = true; DX = static_cast(DX) > 0 ? Max - 1 : 0; } + if (DY >= Max) { bClamp = true; DY = static_cast(DY) > 0 ? Max - 1 : 0; } + + Ar->WriteBits(DX, Max); + Ar->WriteBits(DY, Max); + + return !bClamp; + } + + template + bool ReadPackedIrisFloat2(float &X, float &Y, FNetBitStreamReader* Ar) + { + uint32 Bits = 0; + + // Serialize how many bits each component will have + Bits = Ar->ReadBits(MaxBitsPerComponent); + //Ar.SerializeInt(Bits, MaxBitsPerComponent); + + int32 Bias = 1 << (Bits + 1); + uint32 Max = 1 << (Bits + 2); + uint32 DX = 0; + uint32 DY = 0; + + DX = Ar->ReadBits(Max); + DY = Ar->ReadBits(Max); + //Ar.SerializeInt(DX, Max); + //Ar.SerializeInt(DY, Max); + + + float fact = (float)ScaleFactor; + + X = (float)(static_cast(DX) - Bias) / fact; + Y = (float)(static_cast(DY) - Bias) / fact; + + return true; + } +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRAIController.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRAIController.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRAIController.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRAIController.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBPDatatypes.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBPDatatypes.h similarity index 99% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBPDatatypes.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBPDatatypes.h index f04ed78..0e3284a 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBPDatatypes.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBPDatatypes.h @@ -770,14 +770,14 @@ public: UPROPERTY(EditDefaultsOnly, Category = Replication, AdvancedDisplay) EVRRotationQuantization RotationQuantizationLevel; - FORCEINLINE uint16 CompressAxisTo10BitShort(float Angle) + FORCEINLINE static uint16 CompressAxisTo10BitShort(float Angle) { // map [0->360) to [0->1024) and mask off any winding return FMath::RoundToInt(Angle * 1024.f / 360.f) & 0xFFFF; } - FORCEINLINE float DecompressAxisFrom10BitShort(uint16 Angle) + FORCEINLINE static float DecompressAxisFrom10BitShort(uint16 Angle) { // map [0->1024) to [0->360) return (Angle * 360.f / 1024.f); @@ -1243,19 +1243,25 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AdvancedGripSettings") bool bDisallowLerping; + // If true, we will not set the position on grip release of a client auth grip + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AdvancedGripSettings") + bool bDisallowSettingPositionOnClientAuthDrop; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AdvancedGripSettings") FBPAdvGripPhysicsSettings PhysicsSettings; FBPAdvGripSettings() : GripPriority(1), bSetOwnerOnGrip(1), - bDisallowLerping(0) + bDisallowLerping(0), + bDisallowSettingPositionOnClientAuthDrop(0) {} FBPAdvGripSettings(int GripPrio) : GripPriority(GripPrio), bSetOwnerOnGrip(1), - bDisallowLerping(0) + bDisallowLerping(0), + bDisallowSettingPositionOnClientAuthDrop(0) {} }; diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacter.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacter.h similarity index 98% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacter.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacter.h index c63ef91..d34d935 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacter.h +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacter.h @@ -7,6 +7,9 @@ #include "ReplicatedVRCameraComponent.h" #include "GameFramework/Character.h" #include "Navigation/PathFollowingComponent.h" + +#include "Iris/Serialization/NetSerializer.h" + #include "VRBaseCharacter.generated.h" class AVRPlayerController; @@ -179,6 +182,7 @@ public: CapsuleHeight(0.0f) {} + /** Network serialization */ bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) { @@ -590,4 +594,29 @@ public: UFUNCTION(BlueprintCallable, Category = "VRBaseCharacter|Navigation") bool GetCurrentNavigationPathPoints(TArray& NavigationPointList); -}; \ No newline at end of file +}; + + + +USTRUCT() +struct FVRReplicatedCapsuleHeightNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FVRReplicatedCapsuleHeightNetSerializer, VREXPANSIONPLUGIN_API); +} + + +USTRUCT() +struct FVRSeatedCharacterInfoNetSerializerConfig : public FNetSerializerConfig +{ + GENERATED_BODY() +}; + +namespace UE::Net +{ + UE_NET_DECLARE_SERIALIZER(FVRSeatedCharacterInfoNetSerializer, VREXPANSIONPLUGIN_API); +} \ No newline at end of file diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacterMovementComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacterMovementComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacterMovementComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRBaseCharacterMovementComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacter.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacter.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacter.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacter.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacterMovementComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacterMovementComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacterMovementComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRCharacterMovementComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionFunctionLibrary.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionFunctionLibrary.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionFunctionLibrary.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionFunctionLibrary.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionPlugin.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionPlugin.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionPlugin.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRExpansionPlugin.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGestureComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGestureComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGestureComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGestureComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGlobalSettings.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGlobalSettings.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGlobalSettings.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGlobalSettings.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGripInterface.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGripInterface.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGripInterface.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRGripInterface.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPathFollowingComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPathFollowingComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPathFollowingComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPathFollowingComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPlayerController.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPlayerController.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPlayerController.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRPlayerController.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRRootComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRRootComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRRootComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRRootComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRStereoWidgetComponent.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRStereoWidgetComponent.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRStereoWidgetComponent.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRStereoWidgetComponent.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRTrackedParentInterface.h b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRTrackedParentInterface.h similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRTrackedParentInterface.h rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/Public/VRTrackedParentInterface.h diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/VRExpansionPlugin.Build.cs b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/VRExpansionPlugin.Build.cs similarity index 100% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/Source/VRExpansionPlugin/VRExpansionPlugin.Build.cs rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/Source/VRExpansionPlugin/VRExpansionPlugin.Build.cs diff --git a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/VRExpansionPlugin.uplugin b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin.uplugin similarity index 95% rename from VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/VRExpansionPlugin.uplugin rename to VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin.uplugin index cb68065..f7e3843 100644 --- a/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin/VRExpansionPlugin.uplugin +++ b/VIRTUOS_ExpansionPluginTests/Plugins/VRExpansionPlugin/VRExpansionPlugin.uplugin @@ -1,7 +1,7 @@ { "FileVersion": 3, - "Version": 5.4, - "VersionName": "5.4", + "Version": 5.7, + "VersionName": "5.7", "FriendlyName": "VRExpansionPlugin", "Description": "Adds several new VR features & components to UE4", "Category": "VRExpansion", diff --git a/VIRTUOS_ExpansionPluginTests/VRExpPluginExample.uproject b/VIRTUOS_ExpansionPluginTests/VRExpPluginExample.uproject index 0670cf6..350eb11 100644 --- a/VIRTUOS_ExpansionPluginTests/VRExpPluginExample.uproject +++ b/VIRTUOS_ExpansionPluginTests/VRExpPluginExample.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "5.6", + "EngineAssociation": "5.7", "Category": "", "Description": "", "Modules": [