fix a bug where sgpawn hand's finger collider interact with the world when the hand is not mesh visible

This commit is contained in:
Mamadou Babaei
2024-08-16 18:01:37 +02:00
parent 3325cb5e8f
commit 528243f849
2 changed files with 84 additions and 143 deletions
@@ -118,6 +118,9 @@ struct ASGPawn::FImpl
void UpdateRightHandLocationAndRotation(
const FVector& Location, const FRotator& Rotation, const bool bUpdateVirtualHand);
void SetFingerColliderCollisionEnabled(USphereComponent* Collider, bool bEnabled) const;
void SetAllFingersColliderCollisionEnabled(bool bRight, bool bEnabled) const;
FORCEINLINE void RegisterLeftHandOverlappedActor(const AActor* Actor) const
{
Owner->LeftHandOverlappedActors.AddUnique(Actor);
@@ -254,15 +257,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftThumbFingertipGrabCollider->SetCanEverAffectNavigation(false);
LeftThumbFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftThumbFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn);
LeftThumbFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftThumbFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftThumbFingertipGrabCollider, true);
LeftIndexFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftIndexFingertipGrabCollider"));
@@ -274,15 +269,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftIndexFingertipGrabCollider->SetCanEverAffectNavigation(false);
LeftIndexFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftIndexFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn);
LeftIndexFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftIndexFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftIndexFingertipGrabCollider, true);
LeftMiddleFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftMiddleFingertipGrabCollider"));
@@ -294,15 +281,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftMiddleFingertipGrabCollider->SetCanEverAffectNavigation(false);
LeftMiddleFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftMiddleFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn);
LeftMiddleFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftMiddleFingertipGrabCollider, true);
LeftThumbFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftThumbFingertipTouchCollider"));
@@ -314,15 +293,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftThumbFingertipTouchCollider->SetCanEverAffectNavigation(false);
LeftThumbFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftThumbFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
LeftThumbFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftThumbFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftThumbFingertipTouchCollider, true);
LeftIndexFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftIndexFingertipTouchCollider"));
@@ -334,15 +305,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftIndexFingertipTouchCollider->SetCanEverAffectNavigation(false);
LeftIndexFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftIndexFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
LeftIndexFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftIndexFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftIndexFingertipTouchCollider, true);
LeftMiddleFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftMiddleFingertipTouchCollider"));
@@ -355,14 +318,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftMiddleFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftMiddleFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
LeftMiddleFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftMiddleFingertipTouchCollider, true);
LeftRingFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftRingFingertipTouchCollider"));
@@ -374,15 +330,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftRingFingertipTouchCollider->SetCanEverAffectNavigation(false);
LeftRingFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftRingFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
LeftRingFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftRingFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftRingFingertipTouchCollider, true);
LeftPinkyFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("LeftPinkyFingertipTouchCollider"));
@@ -394,15 +342,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
LeftPinkyFingertipTouchCollider->SetCanEverAffectNavigation(false);
LeftPinkyFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
LeftPinkyFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
LeftPinkyFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
LeftPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(LeftPinkyFingertipTouchCollider, true);
WristTrackerRight = ObjectInitializer.CreateDefaultSubobject<USGWristTrackerComponent>(
this, TEXT("WristTrackerRight"));
@@ -476,15 +416,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightThumbFingertipGrabCollider->SetCanEverAffectNavigation(false);
RightThumbFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightThumbFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn);
RightThumbFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightThumbFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightThumbFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightThumbFingertipGrabCollider, true);
RightIndexFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightIndexFingertipGrabCollider"));
@@ -496,15 +428,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightIndexFingertipGrabCollider->SetCanEverAffectNavigation(false);
RightIndexFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightIndexFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn);
RightIndexFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightIndexFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightIndexFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightIndexFingertipGrabCollider, true);
RightMiddleFingertipGrabCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightMiddleFingertipGrabCollider"));
@@ -516,15 +440,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightMiddleFingertipGrabCollider->SetCanEverAffectNavigation(false);
RightMiddleFingertipGrabCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightMiddleFingertipGrabCollider->SetCollisionObjectType(ECC_Pawn);
RightMiddleFingertipGrabCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightMiddleFingertipGrabCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightMiddleFingertipGrabCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightMiddleFingertipGrabCollider, true);
RightThumbFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightThumbFingertipTouchCollider"));
@@ -536,15 +452,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightThumbFingertipTouchCollider->SetCanEverAffectNavigation(false);
RightThumbFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightThumbFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
RightThumbFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightThumbFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightThumbFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightThumbFingertipTouchCollider, true);
RightIndexFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightIndexFingertipTouchCollider"));
@@ -556,15 +464,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightIndexFingertipTouchCollider->SetCanEverAffectNavigation(false);
RightIndexFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightIndexFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
RightIndexFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightIndexFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightIndexFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightIndexFingertipTouchCollider, true);
RightMiddleFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightMiddleFingertipTouchCollider"));
@@ -576,15 +476,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightMiddleFingertipTouchCollider->SetCanEverAffectNavigation(false);
RightMiddleFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightMiddleFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
RightMiddleFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightMiddleFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightMiddleFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightMiddleFingertipTouchCollider, true);
RightRingFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightRingFingertipTouchCollider"));
@@ -596,15 +488,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightRingFingertipTouchCollider->SetCanEverAffectNavigation(false);
RightRingFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightRingFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
RightRingFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightRingFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightRingFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightRingFingertipTouchCollider, true);
RightPinkyFingertipTouchCollider = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(
this, TEXT("RightPinkyFingertipTouchCollider"));
@@ -616,15 +500,7 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightPinkyFingertipTouchCollider->SetCanEverAffectNavigation(false);
RightPinkyFingertipTouchCollider->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_Owner;
RightPinkyFingertipTouchCollider->SetCollisionObjectType(ECC_Pawn);
RightPinkyFingertipTouchCollider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
RightPinkyFingertipTouchCollider->SetCollisionResponseToAllChannels(ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
Pimpl->SetFingerColliderCollisionEnabled(RightPinkyFingertipTouchCollider, true);
MaxNumberOfHandVelocitySamples = 10;
@@ -702,6 +578,16 @@ void ASGPawn::BeginPlay()
Pimpl->UpdateRightHandRotation(Rotation, !Pimpl->IsRightHandOverlappingWithAnyActor());
});
HandLeft->OnHandVisibilityChanged().AddWeakLambda(this, [&](const bool bNewVisibility)-> void
{
Pimpl->SetAllFingersColliderCollisionEnabled(false, bNewVisibility);
});
HandRight->OnHandVisibilityChanged().AddWeakLambda(this, [&](const bool bNewVisibility)-> void
{
Pimpl->SetAllFingersColliderCollisionEnabled(true, bNewVisibility);
});
Pimpl->BindRealHandsOverlapEvents();
Pimpl->BindFingerGrabOverlapEvents();
@@ -1904,6 +1790,60 @@ void ASGPawn::FImpl::UpdateRightHandLocationAndRotation(
UpdateRightHandRotation(Rotation, bUpdateVirtualHand);
}
void ASGPawn::FImpl::SetFingerColliderCollisionEnabled(USphereComponent* Collider, const bool bEnabled) const
{
if (!ensureAlwaysMsgf(IsValid(Collider), TEXT("Invalid collider object!")))
{
return;
}
if (bEnabled)
{
Collider->SetGenerateOverlapEvents(true);
Collider->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
Collider->SetCollisionResponseToAllChannels(ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_Visibility, ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_PhysicsBody, ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
Collider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
}
else
{
Collider->SetGenerateOverlapEvents(false);
Collider->SetCollisionEnabled(ECollisionEnabled::NoCollision);
Collider->SetCollisionResponseToAllChannels(ECR_Ignore);
}
}
void ASGPawn::FImpl::SetAllFingersColliderCollisionEnabled(const bool bRight, const bool bEnabled) const
{
if (bRight)
{
SetFingerColliderCollisionEnabled(Owner->RightThumbFingertipGrabCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightThumbFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightIndexFingertipGrabCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightIndexFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightMiddleFingertipGrabCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightMiddleFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightRingFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->RightPinkyFingertipTouchCollider, bEnabled);
}
else
{
SetFingerColliderCollisionEnabled(Owner->LeftThumbFingertipGrabCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftThumbFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftIndexFingertipGrabCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftIndexFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftMiddleFingertipGrabCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftMiddleFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftRingFingertipTouchCollider, bEnabled);
SetFingerColliderCollisionEnabled(Owner->LeftPinkyFingertipTouchCollider, bEnabled);
}
}
void ASGPawn::FImpl::DisableActorPhysics(const AActor* Actor) const
{
UPrimitiveComponent* ActorRootComponent{Cast<UPrimitiveComponent>(Actor->GetRootComponent())};