Work on Inventory (Stacking seems to work now), Update Dependencies

This commit is contained in:
Simeon "Waldo" Wallrath 2024-11-09 15:59:32 +01:00
parent f6c05d68e3
commit fdb352ddf1
29 changed files with 224 additions and 184 deletions

Binary file not shown.

@ -1 +1 @@
Subproject commit 2c50d98d0de49b79602a30397dbda089b672c3b6 Subproject commit 006e2b4922eb4f7af0d6df1468a042a98eecf68f

View file

@ -37,7 +37,12 @@
"Plugins": [ "Plugins": [
{ {
"Name": "OpenXR", "Name": "OpenXR",
"Enabled": true "Enabled": true,
"PlatformAllowList": [
"Win64",
"Linux",
"Android"
]
}, },
{ {
"Name": "XRBase", "Name": "XRBase",
@ -45,3 +50,4 @@
} }
] ]
} }

View file

@ -51,7 +51,7 @@ namespace UnrealBuildTool.Rules
} }
); );
if (Target.Platform != UnrealTargetPlatform.Mac) if (Target.Platform != UnrealTargetPlatform.Mac && Target.Platform != UnrealTargetPlatform.IOS)
{ {
PrivateDependencyModuleNames.AddRange( PrivateDependencyModuleNames.AddRange(
new string[] new string[]

View file

@ -107,7 +107,7 @@ TWeakObjectPtr<UAnimSequence> FHandSocketComponentDetails::SaveAnimationAsset(co
if (!BaseAnimation) if (!BaseAnimation)
{ {
LocalPoses = HandSocketComponent->VisualizationMesh->GetSkeleton()->GetRefLocalPoses(); LocalPoses = HandSocketComponent->VisualizationMesh->GetRefSkeleton().GetRefBonePose();
} }
// If not, create new one now. // If not, create new one now.
@ -251,7 +251,7 @@ TWeakObjectPtr<UAnimSequence> FHandSocketComponentDetails::SaveAnimationAsset(co
int32 BoneIndex = BoneTreeIndex;//AnimSkeleton->GetMeshBoneIndexFromSkeletonBoneIndex(SkeletalMesh, BoneTreeIndex); int32 BoneIndex = BoneTreeIndex;//AnimSkeleton->GetMeshBoneIndexFromSkeletonBoneIndex(SkeletalMesh, BoneTreeIndex);
//int32 ParentIndex = SkeletalMesh->RefSkeleton.GetParentIndex(BoneIndex); //int32 ParentIndex = SkeletalMesh->RefSkeleton.GetParentIndex(BoneIndex);
FTransform LocalTransform = LocalPoses[BoneIndex]; FTransform LocalTransform = LocalPoses[BoneIndex];
//FTransform LocalTransform = RefSkeleton.GetRefBonePose()[BoneIndex];
FName BoneName = AnimSkeleton->GetReferenceSkeleton().GetBoneName(BoneIndex); FName BoneName = AnimSkeleton->GetReferenceSkeleton().GetBoneName(BoneIndex);

View file

@ -75,6 +75,9 @@ void UGS_Melee::UpdateDualHandInfo()
{ {
if (NumControllers > 1) if (NumControllers > 1)
{ {
if (!Grip.IsValid())
continue;
FBPActorGripInformation* GripInfo = Grip.HoldingController->GetGripPtrByID(Grip.GripID); FBPActorGripInformation* GripInfo = Grip.HoldingController->GetGripPtrByID(Grip.GripID);
if (GripInfo) if (GripInfo)
{ {

View file

@ -9,7 +9,7 @@
#include UE_INLINE_GENERATED_CPP_BY_NAME(GrippablePhysicsReplication) #include UE_INLINE_GENERATED_CPP_BY_NAME(GrippablePhysicsReplication)
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "PhysicsEngine\BodyInstance.h" #include "PhysicsEngine/BodyInstance.h"
#include "Components/PrimitiveComponent.h" #include "Components/PrimitiveComponent.h"
#include "Components/SkeletalMeshComponent.h" #include "Components/SkeletalMeshComponent.h"
#include "UObject/ObjectMacros.h" #include "UObject/ObjectMacros.h"

View file

@ -19,6 +19,7 @@
#include "GripMotionControllerComponent.h" #include "GripMotionControllerComponent.h"
//#include "VRGripInterface.h" //#include "VRGripInterface.h"
//#include "VRBPDatatypes.h" //#include "VRBPDatatypes.h"
#include "Engine/SkinnedAssetCommon.h"
#include "Net/UnrealNetwork.h" #include "Net/UnrealNetwork.h"
#include "Serialization/CustomVersion.h" #include "Serialization/CustomVersion.h"
@ -396,7 +397,8 @@ bool UHandSocketComponent::GetBlendedPoseSnapShot(FPoseSnapshot& PoseSnapShot, U
PoseSnapShot.LocalTransforms.Empty(); PoseSnapShot.LocalTransforms.Empty();
TargetMesh->GetBoneNames(PoseSnapShot.BoneNames); TargetMesh->GetBoneNames(PoseSnapShot.BoneNames);
PoseSnapShot.LocalTransforms = TargetMesh->GetSkinnedAsset()->GetSkeleton()->GetRefLocalPoses(); //PoseSnapShot.LocalTransforms = TargetMesh->GetSkinnedAsset()->GetSkeleton()->GetRefLocalPoses();
PoseSnapShot.LocalTransforms = TargetMesh->GetSkinnedAsset()->GetRefSkeleton().GetRefBonePose();
FQuat DeltaQuat = FQuat::Identity; FQuat DeltaQuat = FQuat::Identity;
FName TargetBoneName = NAME_None; FName TargetBoneName = NAME_None;
@ -781,9 +783,11 @@ void UHandSocketComponent::PoseVisualizationToAnimation(bool bForceRefresh)
if (!HandTargetAnimation) if (!HandTargetAnimation)
{ {
// Store local poses for posing // Store local poses for posing
LocalPoses = HandVisualizerComponent->GetSkinnedAsset()->GetSkeleton()->GetRefLocalPoses(); LocalPoses = HandVisualizerComponent->GetSkinnedAsset()->GetRefSkeleton().GetRefBonePose();
} }
// Check out of the skin cache, the poses don't update otherwise when enabled // Check out of the skin cache, the poses don't update otherwise when enabled
int32 NumLODs = HandVisualizerComponent->GetNumLODs(); int32 NumLODs = HandVisualizerComponent->GetNumLODs();
HandVisualizerComponent->SkinCacheUsage.Empty(NumLODs); HandVisualizerComponent->SkinCacheUsage.Empty(NumLODs);
@ -840,6 +844,7 @@ void UHandSocketComponent::PoseVisualizationToAnimation(bool bForceRefresh)
else else
{ {
BoneTrans = LocalPoses[i]; BoneTrans = LocalPoses[i];
//BoneTrans = HandVisualizerComponent->GetSkinnedAsset()->GetRefSkeleton().GetRefBonePose()[i];
} }
BoneTrans = BoneTrans * ParentTrans;// *HandVisualizerComponent->GetComponentTransform(); BoneTrans = BoneTrans * ParentTrans;// *HandVisualizerComponent->GetComponentTransform();
@ -850,7 +855,6 @@ void UHandSocketComponent::PoseVisualizationToAnimation(bool bForceRefresh)
BoneTrans.ConcatenateRotation(DeltaQuat); BoneTrans.ConcatenateRotation(DeltaQuat);
BoneTrans.NormalizeRotation(); BoneTrans.NormalizeRotation();
HandVisualizerComponent->SetBoneTransformByName(BonesNames[i], BoneTrans, EBoneSpaces::ComponentSpace); HandVisualizerComponent->SetBoneTransformByName(BonesNames[i], BoneTrans, EBoneSpaces::ComponentSpace);
} }
if (HandVisualizerComponent && (!bTickedPose || bForceRefresh)) if (HandVisualizerComponent && (!bTickedPose || bForceRefresh))

View file

@ -278,16 +278,26 @@ void UVRDialComponent::OnGripRelease_Implementation(UGripMotionControllerCompone
{ {
this->SetRelativeRotation((FTransform(UVRInteractibleFunctionLibrary::SetAxisValueRot(DialRotationAxis, FMath::GridSnap(CurRotBackEnd, SnapAngleIncrement), FRotator::ZeroRotator)) * InitialRelativeTransform).Rotator()); this->SetRelativeRotation((FTransform(UVRInteractibleFunctionLibrary::SetAxisValueRot(DialRotationAxis, FMath::GridSnap(CurRotBackEnd, SnapAngleIncrement), FRotator::ZeroRotator)) * InitialRelativeTransform).Rotator());
CurRotBackEnd = FMath::GridSnap(CurRotBackEnd, SnapAngleIncrement); CurRotBackEnd = FMath::GridSnap(CurRotBackEnd, SnapAngleIncrement);
}
}
if (bUseRollover) if (bUseRollover)
{ {
CurrentDialAngle = FMath::RoundToFloat(CurRotBackEnd); CurrentDialAngle = FMath::RoundToFloat(CurRotBackEnd);
}
else
{
CurrentDialAngle = FRotator::ClampAxis(FMath::RoundToFloat(CurRotBackEnd));
}
}
else
{
// Reset to the snap angle so that it requires full motion to break out of it
CurRotBackEnd = CurrentDialAngle;
}
} }
else else
{ {
CurrentDialAngle = FRotator::ClampAxis(FMath::RoundToFloat(CurRotBackEnd)); // Reset to the snap angle so that it requires full motion to break out of it
CurRotBackEnd = CurrentDialAngle;
} }
if (!FMath::IsNearlyEqual(LastSnapAngle, CurrentDialAngle)) if (!FMath::IsNearlyEqual(LastSnapAngle, CurrentDialAngle))

View file

@ -0,0 +1,143 @@
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#include "Misc/VRGameViewportClient.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(VRGameViewportClient)
#include "CoreMinimal.h"
UVRGameViewportClient::UVRGameViewportClient(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
GameInputMethod = EVRGameInputMethod::GameInput_Default;
bAlsoChangeGamepPadInput = false;
}
bool UVRGameViewportClient::IsValidGamePadKey(const FKey & InputKey)
{
if (!bAlsoChangeGamepPadInput)
return false;
FName KeyCategory = InputKey.GetMenuCategory();
return GamepadInputCategories.Contains(KeyCategory);
}
bool UVRGameViewportClient::EventWindowClosing()
{
if (BPOnWindowCloseRequested.IsBound())
{
BPOnWindowCloseRequested.Broadcast();
}
if (bIgnoreWindowCloseCommands)
{
return false;
}
return true;
}
void UVRGameViewportClient::PostInitProperties()
{
Super::PostInitProperties();
if (GamepadInputCategories.Num() < 1)
{
GamepadInputCategories.Add(FName(TEXT("Gamepad")));
GamepadInputCategories.Add(FName(TEXT("PS4")));
GamepadInputCategories.Add(FName(TEXT("XBox One")));
GamepadInputCategories.Add(FName(TEXT("Touch")));
GamepadInputCategories.Add(FName(TEXT("Gesture")));
}
OnWindowCloseRequested().BindUObject(this, &UVRGameViewportClient::EventWindowClosing);
}
bool UVRGameViewportClient::InputKey(const FInputKeyEventArgs& EventArgs)
{
// Remap the old int32 ControllerId value to the new InputDeviceId
IPlatformInputDeviceMapper& DeviceMapper = IPlatformInputDeviceMapper::Get();
// Early out if a gamepad event or ignoring input or is default setup / no GEngine
if(GameInputMethod == EVRGameInputMethod::GameInput_Default || IgnoreInput() || (EventArgs.IsGamepad() && !IsValidGamePadKey(EventArgs.Key)))
return Super::InputKey(EventArgs);
const int32 NumLocalPlayers = World->GetGameInstance()->GetNumLocalPlayers();
// Also early out if number of players is less than 2
if (NumLocalPlayers < 2)
return Super::InputKey(EventArgs);
// Its const so have to copy and send a new one in now that the function signature has changed
FInputKeyEventArgs NewStruct = EventArgs;
if (GameInputMethod == EVRGameInputMethod::GameInput_KeyboardAndMouseToPlayer2)
{
// keyboard / mouse always go to player 0, so + 1 will be player 2
NewStruct.ControllerId++;
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(NewStruct.ControllerId, UserId, NewStruct.InputDevice);
return Super::InputKey(NewStruct);
}
else // Shared keyboard and mouse
{
bool bRetVal = false;
for (int32 i = 0; i < NumLocalPlayers; i++)
{
NewStruct.ControllerId = i;
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(NewStruct.ControllerId, UserId, NewStruct.InputDevice);
bRetVal = Super::InputKey(NewStruct) || bRetVal;
}
return bRetVal;
}
}
bool UVRGameViewportClient::InputAxis(FViewport* tViewport, FInputDeviceId InputDevice, FKey Key, float Delta, float DeltaTime, int32 NumSamples, bool bGamepad)
{
// Remap the old int32 ControllerId value to the new InputDeviceId
IPlatformInputDeviceMapper& DeviceMapper = IPlatformInputDeviceMapper::Get();
const int32 NumLocalPlayers = World->GetGameInstance()->GetNumLocalPlayers();
// Early out if a gamepad or not a mouse event (vr controller) or ignoring input or is default setup / no GEngine
if (((!Key.IsMouseButton() && !bGamepad) || (bGamepad && !IsValidGamePadKey(Key))) || NumLocalPlayers < 2 || GameInputMethod == EVRGameInputMethod::GameInput_Default || IgnoreInput())
return Super::InputAxis(tViewport, InputDevice, Key, Delta, DeltaTime, NumSamples, bGamepad);
if (GameInputMethod == EVRGameInputMethod::GameInput_KeyboardAndMouseToPlayer2)
{
// keyboard / mouse always go to player 0, so + 1 will be player 2
int32 ControllerId = 1;
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(ControllerId, UserId, DeviceId);
return Super::InputAxis(tViewport, DeviceId, Key, Delta, DeltaTime, NumSamples, bGamepad);
}
else // Shared keyboard and mouse
{
bool bRetVal = false;
for (int32 i = 0; i < NumLocalPlayers; i++)
{
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(i, UserId, DeviceId);
bRetVal = Super::InputAxis(tViewport, DeviceId, Key, Delta, DeltaTime, NumSamples, bGamepad) || bRetVal;
}
return bRetVal;
}
}

View file

@ -4,8 +4,8 @@
#include UE_INLINE_GENERATED_CPP_BY_NAME(VRLogComponent) #include UE_INLINE_GENERATED_CPP_BY_NAME(VRLogComponent)
#include "Engine/Engine.h" #include "Engine/Engine.h"
#include "GenericPlatform\GenericPlatformInputDeviceMapper.h" #include "GenericPlatform/GenericPlatformInputDeviceMapper.h"
#include "Engine\GameViewportClient.h" #include "Engine/GameViewportClient.h"
#include "GlobalRenderResources.h" #include "GlobalRenderResources.h"
//#include "Engine/Engine.h" //#include "Engine/Engine.h"

View file

@ -7,7 +7,7 @@
#include "GlobalRenderResources.h" #include "GlobalRenderResources.h"
#include "Components/ActorComponent.h" #include "Components/ActorComponent.h"
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
#include "GameFramework\Pawn.h" #include "GameFramework/Pawn.h"
#include "GameFramework/PlayerState.h" #include "GameFramework/PlayerState.h"
#include "GameFramework/PlayerController.h" #include "GameFramework/PlayerController.h"
#include "Engine/TextureRenderTarget2D.h" #include "Engine/TextureRenderTarget2D.h"

View file

@ -3,9 +3,9 @@
#include UE_INLINE_GENERATED_CPP_BY_NAME(VRMoverComponent) #include UE_INLINE_GENERATED_CPP_BY_NAME(VRMoverComponent)
#include "VRBPDatatypes.h" #include "VRBPDatatypes.h"
#include "DefaultMovementSet\LayeredMoves\BasicLayeredMoves.h" #include "DefaultMovementSet/LayeredMoves/BasicLayeredMoves.h"
#include "Engine/BlueprintGeneratedClass.h" #include "Engine/BlueprintGeneratedClass.h"
#include "Curves\CurveFloat.h" // Delete after tests, only needed for cloning #include "Curves/CurveFloat.h" // Delete after tests, only needed for cloning
#include "ReplicatedVRCameraComponent.h" #include "ReplicatedVRCameraComponent.h"
DEFINE_LOG_CATEGORY(LogVRMoverComponent); DEFINE_LOG_CATEGORY(LogVRMoverComponent);

View file

@ -5,7 +5,7 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "VRGlobalSettings.h" #include "VRGlobalSettings.h"
#include "Components\PrimitiveComponent.h" #include "Components/PrimitiveComponent.h"
#include "HAL/IConsoleManager.h" #include "HAL/IConsoleManager.h"
#include "Chaos/ChaosEngineInterface.h" #include "Chaos/ChaosEngineInterface.h"

View file

@ -19,7 +19,7 @@
#include "Navigation/PathFollowingComponent.h" #include "Navigation/PathFollowingComponent.h"
#include "VRPlayerController.h" #include "VRPlayerController.h"
#include "GameFramework/PhysicsVolume.h" #include "GameFramework/PhysicsVolume.h"
#include "Animation\AnimInstance.h" #include "Animation/AnimInstance.h"
DEFINE_LOG_CATEGORY(LogVRBaseCharacterMovement); DEFINE_LOG_CATEGORY(LogVRBaseCharacterMovement);

View file

@ -506,6 +506,8 @@ void UVRRootComponent::TickComponent(float DeltaTime, enum ELevelTick TickType,
if (IsLocallyControlled()) if (IsLocallyControlled())
{ {
bool bHadBadTracking = false;
if (owningVRChar && owningVRChar->bTrackingPaused) if (owningVRChar && owningVRChar->bTrackingPaused)
{ {
curCameraLoc = owningVRChar->PausedTrackingLoc; curCameraLoc = owningVRChar->PausedTrackingLoc;
@ -524,6 +526,7 @@ void UVRRootComponent::TickComponent(float DeltaTime, enum ELevelTick TickType,
{ {
curCameraLoc = lastCameraLoc; curCameraLoc = lastCameraLoc;
curCameraRot = lastCameraRot; curCameraRot = lastCameraRot;
bHadBadTracking = true;
} }
else else
{ {
@ -562,7 +565,7 @@ void UVRRootComponent::TickComponent(float DeltaTime, enum ELevelTick TickType,
// Can adjust the relative tolerances to remove jitter and some update processing // Can adjust the relative tolerances to remove jitter and some update processing
if (!bRetainRoomscale || (!curCameraLoc.Equals(lastCameraLoc, 0.01f) || !curCameraRot.Equals(lastCameraRot, 0.01f))) if (!bHadBadTracking && (!bRetainRoomscale || (!curCameraLoc.Equals(lastCameraLoc, 0.01f) || !curCameraRot.Equals(lastCameraRot, 0.01f))))
{ {
// Also calculate vector of movement for the movement component // Also calculate vector of movement for the movement component
FVector LastPosition = OffsetComponentToWorld.GetLocation(); FVector LastPosition = OffsetComponentToWorld.GetLocation();
@ -638,7 +641,6 @@ void UVRRootComponent::TickComponent(float DeltaTime, enum ELevelTick TickType,
} }
else else
{ {
// Run this first so we get full fidelity on the relative space calculation // Run this first so we get full fidelity on the relative space calculation
FVector NewLocation = StoredCameraRotOffset.RotateVector(FVector(VRCapsuleOffset.X, VRCapsuleOffset.Y, 0.0f)) + curCameraLoc; FVector NewLocation = StoredCameraRotOffset.RotateVector(FVector(VRCapsuleOffset.X, VRCapsuleOffset.Y, 0.0f)) + curCameraLoc;
FVector PlanerLocation = NewLocation - lastCameraLoc; FVector PlanerLocation = NewLocation - lastCameraLoc;
@ -1545,7 +1547,7 @@ bool UVRRootComponent::IsLocallyControlled() const
GenerateOffsetToWorld(); GenerateOffsetToWorld();
}*/ }*/
if (!owningVRChar->bRetainRoomscale && !IsLocallyControlled()) if (!owningVRChar->bRetainRoomscale && !IsLocallyControlled() && !IsNetMode(NM_DedicatedServer))
{ {
// Don't smooth this change in mesh position // Don't smooth this change in mesh position
FNetworkPredictionData_Client_Character* ClientData = owningVRChar->GetCharacterMovement()->GetPredictionData_Client_Character(); FNetworkPredictionData_Client_Character* ClientData = owningVRChar->GetCharacterMovement()->GetPredictionData_Client_Character();

View file

@ -169,7 +169,7 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Momentum Settings", meta = (ClampMin = "0.0", UIMin = "0.0")) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Momentum Settings", meta = (ClampMin = "0.0", UIMin = "0.0"))
float MaxLeverMomentum; float MaxLeverMomentum;
UPROPERTY(BlueprintReadOnly, Category = "VRLeverComponent") UPROPERTY(BlueprintReadWrite, Category = "VRLeverComponent")
bool bIsLerping; bool bIsLerping;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripSettings") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripSettings")

View file

@ -54,140 +54,12 @@ public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "VRExpansionPlugin") UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "VRExpansionPlugin")
TArray<FName> GamepadInputCategories; TArray<FName> GamepadInputCategories;
bool IsValidGamePadKey(const FKey & InputKey) bool IsValidGamePadKey(const FKey& InputKey);
{
if (!bAlsoChangeGamepPadInput)
return false;
FName KeyCategory = InputKey.GetMenuCategory();
return GamepadInputCategories.Contains(KeyCategory);
}
UFUNCTION() UFUNCTION()
bool EventWindowClosing() bool EventWindowClosing();
{
if (BPOnWindowCloseRequested.IsBound())
{
BPOnWindowCloseRequested.Broadcast();
}
if (bIgnoreWindowCloseCommands) virtual void PostInitProperties() override;
{ virtual bool InputKey(const FInputKeyEventArgs& EventArgs) override;
return false; virtual bool InputAxis(FViewport* tViewport, FInputDeviceId InputDevice, FKey Key, float Delta, float DeltaTime, int32 NumSamples = 1, bool bGamepad = false) override;
}
return true;
}
virtual void PostInitProperties() override
{
Super::PostInitProperties();
if (GamepadInputCategories.Num() < 1)
{
GamepadInputCategories.Add(FName(TEXT("Gamepad")));
GamepadInputCategories.Add(FName(TEXT("PS4")));
GamepadInputCategories.Add(FName(TEXT("XBox One")));
GamepadInputCategories.Add(FName(TEXT("Touch")));
GamepadInputCategories.Add(FName(TEXT("Gesture")));
}
OnWindowCloseRequested().BindUObject(this, &UVRGameViewportClient::EventWindowClosing);
}
virtual bool InputKey(const FInputKeyEventArgs& EventArgs) override
{
// Remap the old int32 ControllerId value to the new InputDeviceId
IPlatformInputDeviceMapper& DeviceMapper = IPlatformInputDeviceMapper::Get();
// Early out if a gamepad event or ignoring input or is default setup / no GEngine
if(GameInputMethod == EVRGameInputMethod::GameInput_Default || IgnoreInput() || (EventArgs.IsGamepad() && !IsValidGamePadKey(EventArgs.Key)))
return Super::InputKey(EventArgs);
const int32 NumLocalPlayers = World->GetGameInstance()->GetNumLocalPlayers();
// Also early out if number of players is less than 2
if (NumLocalPlayers < 2)
return Super::InputKey(EventArgs);
// Its const so have to copy and send a new one in now that the function signature has changed
FInputKeyEventArgs NewStruct = EventArgs;
if (GameInputMethod == EVRGameInputMethod::GameInput_KeyboardAndMouseToPlayer2)
{
// keyboard / mouse always go to player 0, so + 1 will be player 2
NewStruct.ControllerId++;
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(NewStruct.ControllerId, UserId, NewStruct.InputDevice);
return Super::InputKey(NewStruct);
}
else // Shared keyboard and mouse
{
bool bRetVal = false;
for (int32 i = 0; i < NumLocalPlayers; i++)
{
NewStruct.ControllerId = i;
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(NewStruct.ControllerId, UserId, NewStruct.InputDevice);
bRetVal = Super::InputKey(NewStruct) || bRetVal;
}
return bRetVal;
}
}
virtual bool InputAxis(FViewport* tViewport, FInputDeviceId InputDevice, FKey Key, float Delta, float DeltaTime, int32 NumSamples = 1, bool bGamepad = false) override
{
// Remap the old int32 ControllerId value to the new InputDeviceId
IPlatformInputDeviceMapper& DeviceMapper = IPlatformInputDeviceMapper::Get();
const int32 NumLocalPlayers = World->GetGameInstance()->GetNumLocalPlayers();
// Early out if a gamepad or not a mouse event (vr controller) or ignoring input or is default setup / no GEngine
if (((!Key.IsMouseButton() && !bGamepad) || (bGamepad && !IsValidGamePadKey(Key))) || NumLocalPlayers < 2 || GameInputMethod == EVRGameInputMethod::GameInput_Default || IgnoreInput())
return Super::InputAxis(tViewport, InputDevice, Key, Delta, DeltaTime, NumSamples, bGamepad);
if (GameInputMethod == EVRGameInputMethod::GameInput_KeyboardAndMouseToPlayer2)
{
// keyboard / mouse always go to player 0, so + 1 will be player 2
int32 ControllerId = 1;
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(ControllerId, UserId, DeviceId);
return Super::InputAxis(tViewport, DeviceId, Key, Delta, DeltaTime, NumSamples, bGamepad);
}
else // Shared keyboard and mouse
{
bool bRetVal = false;
for (int32 i = 0; i < NumLocalPlayers; i++)
{
FPlatformUserId UserId = PLATFORMUSERID_NONE;
FInputDeviceId DeviceId = INPUTDEVICEID_NONE;
DeviceMapper.RemapControllerIdToPlatformUserAndDevice(i, UserId, DeviceId);
bRetVal = Super::InputAxis(tViewport, DeviceId, Key, Delta, DeltaTime, NumSamples, bGamepad) || bRetVal;
}
return bRetVal;
}
}
}; };
UVRGameViewportClient::UVRGameViewportClient(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
GameInputMethod = EVRGameInputMethod::GameInput_Default;
bAlsoChangeGamepPadInput = false;
}

View file

@ -6,7 +6,7 @@
//#include "Engine/Engine.h" //#include "Engine/Engine.h"
#include "VRBPDatatypes.h" #include "VRBPDatatypes.h"
#include "Engine/DataAsset.h" #include "Engine/DataAsset.h"
#include "Components\SceneComponent.h" #include "Components/SceneComponent.h"
//#include "Engine/EngineTypes.h" //#include "Engine/EngineTypes.h"
//#include "Engine/EngineBaseTypes.h" //#include "Engine/EngineBaseTypes.h"