refactor and remove the need to cache the component in the grab/release workflow

This commit is contained in:
Mamadou Babaei
2023-05-18 19:03:03 +02:00
parent bfcef91311
commit 21771887c7
8 changed files with 61 additions and 135 deletions
@@ -80,6 +80,9 @@ struct ASGPawn::FImpl
void BindFingerTouchOverlapEvents();
void UnbindFingerTouchOverlapEvents();
void DisableActorPhysics(const AActor* Actor) const;
void EnableActorPhysics(const AActor* Actor) const;
};
ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
@@ -429,10 +432,10 @@ ASGPawn::ASGPawn(const FObjectInitializer& ObjectInitializer)
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Vehicle, ECR_Overlap);
RightPinkyFingertipTouchCollider->SetCollisionResponseToChannel(ECC_Destructible, ECR_Overlap);
LeftHandGrabState = FSGGrabState(HandLeft, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
LeftHandGrabState = FSGGrabState(HandLeft, nullptr, nullptr, nullptr, nullptr);
LeftHandTouchState = FSGTouchState(HandLeft, nullptr, nullptr, nullptr, nullptr, nullptr);
RightHandGrabState = FSGGrabState(HandLeft, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
RightHandGrabState = FSGGrabState(HandLeft, nullptr, nullptr, nullptr, nullptr);
RightHandTouchState = FSGTouchState(HandRight, nullptr, nullptr, nullptr, nullptr, nullptr);
}
@@ -503,7 +506,6 @@ void ASGPawn::OnLeftThumbFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
LeftHandGrabState.ActorThumbCanGrab = OtherActor;
LeftHandGrabState.ComponentThumbCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(LeftHandGrabState);
}
}
@@ -520,7 +522,6 @@ void ASGPawn::OnLeftThumbFingertipGrabColliderOverlapEnds(
if (LeftHandGrabState.ActorThumbCanGrab == OtherActor)
{
LeftHandGrabState.ActorThumbCanGrab = nullptr;
LeftHandGrabState.ComponentThumbCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(LeftHandGrabState);
}
}
@@ -541,7 +542,6 @@ void ASGPawn::OnLeftIndexFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
LeftHandGrabState.ActorIndexCanGrab = OtherActor;
LeftHandGrabState.ComponentIndexCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(LeftHandGrabState);
}
}
@@ -558,7 +558,6 @@ void ASGPawn::OnLeftIndexFingertipGrabColliderOverlapEnds(
if (LeftHandGrabState.ActorIndexCanGrab == OtherActor)
{
LeftHandGrabState.ActorIndexCanGrab = nullptr;
LeftHandGrabState.ComponentIndexCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(LeftHandGrabState);
}
}
@@ -579,7 +578,6 @@ void ASGPawn::OnLeftMiddleFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
LeftHandGrabState.ActorMiddleCanGrab = OtherActor;
LeftHandGrabState.ComponentMiddleCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(LeftHandGrabState);
}
}
@@ -596,7 +594,6 @@ void ASGPawn::OnLeftMiddleFingertipGrabColliderOverlapEnds(
if (LeftHandGrabState.ActorMiddleCanGrab == OtherActor)
{
LeftHandGrabState.ActorMiddleCanGrab = nullptr;
LeftHandGrabState.ComponentMiddleCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(LeftHandGrabState);
}
}
@@ -807,7 +804,6 @@ void ASGPawn::OnRightThumbFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
RightHandGrabState.ActorThumbCanGrab = OtherActor;
RightHandGrabState.ComponentThumbCanGrab = OtherComp;
TouchStateUpdatedEvent.Broadcast(LeftHandTouchState);
}
}
@@ -824,7 +820,6 @@ void ASGPawn::OnRightThumbFingertipGrabColliderOverlapEnds(
if (RightHandGrabState.ActorThumbCanGrab == OtherActor)
{
RightHandGrabState.ActorThumbCanGrab = nullptr;
RightHandGrabState.ComponentThumbCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(RightHandGrabState);
}
}
@@ -845,7 +840,6 @@ void ASGPawn::OnRightIndexFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
RightHandGrabState.ActorIndexCanGrab = OtherActor;
RightHandGrabState.ComponentIndexCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(RightHandGrabState);
}
}
@@ -862,7 +856,6 @@ void ASGPawn::OnRightIndexFingertipGrabColliderOverlapEnds(
if (RightHandGrabState.ActorThumbCanGrab == OtherActor)
{
RightHandGrabState.ActorIndexCanGrab = nullptr;
RightHandGrabState.ComponentIndexCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(RightHandGrabState);
}
}
@@ -883,7 +876,6 @@ void ASGPawn::OnRightMiddleFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
RightHandGrabState.ActorMiddleCanGrab = OtherActor;
RightHandGrabState.ComponentMiddleCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(RightHandGrabState);
}
}
@@ -900,7 +892,6 @@ void ASGPawn::OnRightMiddleFingertipGrabColliderOverlapEnds(
if (RightHandGrabState.ActorMiddleCanGrab == OtherActor)
{
RightHandGrabState.ActorMiddleCanGrab = nullptr;
RightHandGrabState.ComponentMiddleCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(RightHandGrabState);
}
}
@@ -1122,7 +1113,7 @@ bool ASGPawn::IsGrabbing(const USGVirtualHandComponent* Hand, AActor*& OutActor)
return Hand == HandLeft ? IsLeftHandGrabbing(OutActor) : IsRightHandGrabbing(OutActor);
}
void ASGPawn::Grab(USGVirtualHandComponent* Hand, AActor* Actor, UPrimitiveComponent* Component)
void ASGPawn::Grab(USGVirtualHandComponent* Hand, AActor* Actor)
{
if (!ensureAlwaysMsgf(IsValid(Actor), TEXT("%s"), TEXT("ERROR: invalid actor!")))
{
@@ -1147,26 +1138,7 @@ void ASGPawn::Grab(USGVirtualHandComponent* Hand, AActor* Actor, UPrimitiveCompo
if (GrabComponent->GetAffectPhysicsState())
{
const USceneComponent* ActorRootComponent{Cast<USceneComponent>(Actor->GetRootComponent())};
if (!ensureAlwaysMsgf(IsValid(ActorRootComponent), TEXT("%s"), TEXT("ERROR: invalid actor's root component!")))
{
return;
}
TArray<USceneComponent*> ActorChildrenComponents;
ActorRootComponent->GetChildrenComponents(true, ActorChildrenComponents);
for (USceneComponent* SceneComponent: ActorChildrenComponents)
{
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
if (IsValid(PrimitiveComponent))
{
PrimitiveComponent->SetSimulatePhysics(false);
}
}
if (IsValid(Component))
{
Component->SetSimulatePhysics(false);
}
Pimpl->DisableActorPhysics(Actor);
}
const bool bAttached = Actor->AttachToComponent(Hand, MoveTemp(AttachmentRules), SocketName);
@@ -1202,31 +1174,10 @@ void ASGPawn::ReleaseLeft()
if (GrabComponent->GetAffectPhysicsState())
{
const UPrimitiveComponent* ActorRootComponent{
Cast<UPrimitiveComponent>(LeftHandGrabState.GrabbedActor->GetRootComponent())
};
if (ensureAlwaysMsgf(IsValid(ActorRootComponent), TEXT("%s"), TEXT("ERROR: invalid actor's root component!")))
{
TArray<USceneComponent*> ActorChildrenComponents;
ActorRootComponent->GetChildrenComponents(true, ActorChildrenComponents);
for (USceneComponent* SceneComponent: ActorChildrenComponents)
{
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
if (IsValid(PrimitiveComponent))
{
PrimitiveComponent->SetSimulatePhysics(true);
}
}
}
if (IsValid(LeftHandGrabState.GrabbedComponent))
{
LeftHandGrabState.GrabbedComponent->SetSimulatePhysics(true);
}
Pimpl->EnableActorPhysics(LeftHandGrabState.GrabbedActor);
}
LeftHandGrabState.GrabbedActor = nullptr;
LeftHandGrabState.GrabbedComponent = nullptr;
}
void ASGPawn::ReleaseRight()
@@ -1251,31 +1202,10 @@ void ASGPawn::ReleaseRight()
if (GrabComponent->GetAffectPhysicsState())
{
const UPrimitiveComponent* ActorRootComponent{
Cast<UPrimitiveComponent>(LeftHandGrabState.GrabbedActor->GetRootComponent())
};
if (ensureAlwaysMsgf(IsValid(ActorRootComponent), TEXT("%s"), TEXT("ERROR: invalid actor's root component!")))
{
TArray<USceneComponent*> ActorChildrenComponents;
ActorRootComponent->GetChildrenComponents(true, ActorChildrenComponents);
for (USceneComponent* SceneComponent: ActorChildrenComponents)
{
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
if (IsValid(PrimitiveComponent))
{
PrimitiveComponent->SetSimulatePhysics(true);
}
}
}
if (IsValid(RightHandGrabState.GrabbedComponent))
{
RightHandGrabState.GrabbedComponent->SetSimulatePhysics(true);
}
Pimpl->EnableActorPhysics(RightHandGrabState.GrabbedActor);
}
RightHandGrabState.GrabbedActor = nullptr;
RightHandGrabState.GrabbedComponent = nullptr;
}
ASGPawn::FImpl::FImpl(ASGPawn* InOwner)
@@ -1470,6 +1400,38 @@ void ASGPawn::FImpl::UnbindFingerTouchOverlapEvents()
Owner, &ASGPawn::OnRightPinkyFingertipTouchColliderOverlapEnds);
}
void ASGPawn::FImpl::DisableActorPhysics(const AActor* Actor) const
{
TArray<USceneComponent*> ActorComponents;
Actor->GetComponents(ActorComponents);
for (USceneComponent* SceneComponent: ActorComponents)
{
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
if (IsValid(PrimitiveComponent))
{
PrimitiveComponent->SetEnableGravity(false);
PrimitiveComponent->SetSimulatePhysics(false);
PrimitiveComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}
}
}
void ASGPawn::FImpl::EnableActorPhysics(const AActor* Actor) const
{
TArray<USceneComponent*> ActorComponents;
Actor->GetComponents(ActorComponents);
for (USceneComponent* SceneComponent: ActorComponents)
{
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
if (IsValid(PrimitiveComponent))
{
PrimitiveComponent->SetEnableGravity(true);
PrimitiveComponent->SetSimulatePhysics(true);
PrimitiveComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
}
}
}
ASGPawn::FImpl::~FImpl() = default;
void ASGPawn::FImplDeleter::operator()(const FImpl* P) const
@@ -229,7 +229,7 @@ void ASGPlayerController::BeginPlay()
{
if (SGPawn->CanGrab(GrabState.Hand, GrabState.ActorThumbCanGrab))
{
SGPawn->Grab(GrabState.Hand, GrabState.ActorThumbCanGrab, GrabState.ComponentThumbCanGrab);
SGPawn->Grab(GrabState.Hand, GrabState.ActorThumbCanGrab);
}
}
});
@@ -249,7 +249,7 @@ ASGVirtualHandActor::ASGVirtualHandActor(const FObjectInitializer& ObjectInitial
WristTracker->SetRight(VirtualHand->IsRight());
GrabState = FSGGrabState(VirtualHand, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
GrabState = FSGGrabState(VirtualHand, nullptr, nullptr, nullptr, nullptr);
TouchState = FSGTouchState(VirtualHand, nullptr, nullptr, nullptr, nullptr, nullptr);
}
@@ -307,7 +307,6 @@ void ASGVirtualHandActor::OnThumbFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
GrabState.ActorThumbCanGrab = OtherActor;
GrabState.ComponentThumbCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(GrabState);
}
}
@@ -324,7 +323,6 @@ void ASGVirtualHandActor::OnThumbFingertipGrabColliderOverlapEnds(
if (GrabState.ActorThumbCanGrab == OtherActor)
{
GrabState.ActorThumbCanGrab = nullptr;
GrabState.ComponentThumbCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(GrabState);
}
}
@@ -345,7 +343,6 @@ void ASGVirtualHandActor::OnIndexFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
GrabState.ActorIndexCanGrab = OtherActor;
GrabState.ComponentIndexCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(GrabState);
}
}
@@ -362,7 +359,6 @@ void ASGVirtualHandActor::OnIndexFingertipGrabColliderOverlapEnds(
if (GrabState.ActorIndexCanGrab == OtherActor)
{
GrabState.ActorIndexCanGrab = nullptr;
GrabState.ComponentIndexCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(GrabState);
}
}
@@ -383,7 +379,6 @@ void ASGVirtualHandActor::OnMiddleFingertipGrabColliderOverlapBegins(
if (USGGrabComponent::IsGrabbable(OtherActor))
{
GrabState.ActorMiddleCanGrab = OtherActor;
GrabState.ComponentMiddleCanGrab = OtherComp;
GrabStateUpdatedEvent.Broadcast(GrabState);
}
}
@@ -400,7 +395,6 @@ void ASGVirtualHandActor::OnMiddleFingertipGrabColliderOverlapEnds(
if (GrabState.ActorMiddleCanGrab == OtherActor)
{
GrabState.ActorMiddleCanGrab = nullptr;
GrabState.ComponentMiddleCanGrab = nullptr;
GrabStateUpdatedEvent.Broadcast(GrabState);
}
}
@@ -35,7 +35,6 @@
#include "SenseGlove/Haptics/SGGrabState.h"
#include "Components/SphereComponent.h"
#include "GameFramework/Actor.h"
#include "SenseGlove/Components/SGVirtualHandComponent.h"
@@ -43,33 +42,21 @@
FSGGrabState::FSGGrabState()
: Hand(nullptr),
ActorThumbCanGrab(nullptr),
ComponentThumbCanGrab(nullptr),
ActorIndexCanGrab(nullptr),
ComponentIndexCanGrab(nullptr),
ActorMiddleCanGrab(nullptr),
ComponentMiddleCanGrab(nullptr),
GrabbedActor(nullptr),
GrabbedComponent(nullptr)
GrabbedActor(nullptr)
{
}
FSGGrabState::FSGGrabState(USGVirtualHandComponent* InHand,
AActor* InActorThumbCanGrab,
UPrimitiveComponent* InComponentThumbCanGrab,
AActor* InActorIndexCanGrab,
UPrimitiveComponent* InComponentIndexCanGrab,
AActor* InActorMiddleCanGrab,
UPrimitiveComponent* InComponentMiddleCanGrab,
AActor* InGrabbedActor,
UPrimitiveComponent* InGrabbedComponent)
AActor* InGrabbedActor)
: Hand(InHand),
ActorThumbCanGrab(InActorThumbCanGrab),
ComponentThumbCanGrab(InComponentThumbCanGrab),
ActorIndexCanGrab(InActorIndexCanGrab),
ComponentIndexCanGrab(InComponentIndexCanGrab),
ActorMiddleCanGrab(InActorMiddleCanGrab),
ComponentMiddleCanGrab(InComponentMiddleCanGrab),
GrabbedActor(InGrabbedActor),
GrabbedComponent(InGrabbedComponent)
GrabbedActor(InGrabbedActor)
{
}
@@ -589,17 +589,17 @@ public:
}
public:
FORCEINLINE void GrabLeft(AActor* Actor, UPrimitiveComponent* Component)
FORCEINLINE void GrabLeft(AActor* Actor)
{
Grab(HandLeft, Actor, Component);
Grab(HandLeft, Actor);
}
FORCEINLINE void GrabRight(AActor* Actor, UPrimitiveComponent* Component)
FORCEINLINE void GrabRight(AActor* Actor)
{
Grab(HandRight, Actor, Component);
Grab(HandRight, Actor);
}
void Grab(USGVirtualHandComponent* Hand, AActor* Actor, UPrimitiveComponent* Component);
void Grab(USGVirtualHandComponent* Hand, AActor* Actor);
void ReleaseLeft();
@@ -56,37 +56,21 @@ public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
AActor* ActorThumbCanGrab;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
UPrimitiveComponent* ComponentThumbCanGrab;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
AActor* ActorIndexCanGrab;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
UPrimitiveComponent* ComponentIndexCanGrab;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
AActor* ActorMiddleCanGrab;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
UPrimitiveComponent* ComponentMiddleCanGrab;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
AActor* GrabbedActor;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "SenseGlove")
UPrimitiveComponent* GrabbedComponent;
public:
FSGGrabState();
explicit FSGGrabState(USGVirtualHandComponent* InHand,
AActor* InActorThumbCanGrab,
UPrimitiveComponent* InComponentThumbCanGrab,
AActor* InActorIndexCanGrab,
UPrimitiveComponent* InComponentIndexCanGrab,
AActor* InActorMiddleCanGrab,
UPrimitiveComponent* InComponentMiddleCanGrab,
AActor* InGrabbedActor,
UPrimitiveComponent* InGrabbedComponent);
AActor* InGrabbedActor);
};
@@ -208,20 +208,19 @@ bool UPawnKismetLibrary::IsGrabbing(const ASGPawn* Pawn, const USGVirtualHandCom
return Pawn->IsGrabbing(Hand);
}
void UPawnKismetLibrary::GrabLeft(ASGPawn* Pawn, AActor* Actor, UPrimitiveComponent* Component)
void UPawnKismetLibrary::GrabLeft(ASGPawn* Pawn, AActor* Actor)
{
Pawn->GrabLeft(Actor, Component);
Pawn->GrabLeft(Actor);
}
void UPawnKismetLibrary::GrabRight(ASGPawn* Pawn, AActor* Actor, UPrimitiveComponent* Component)
void UPawnKismetLibrary::GrabRight(ASGPawn* Pawn, AActor* Actor)
{
Pawn->GrabRight(Actor, Component);
Pawn->GrabRight(Actor);
}
void UPawnKismetLibrary::Grab(
ASGPawn* Pawn, USGVirtualHandComponent* Hand, AActor* Actor, UPrimitiveComponent* Component)
void UPawnKismetLibrary::Grab(ASGPawn* Pawn, USGVirtualHandComponent* Hand, AActor* Actor)
{
Pawn->Grab(Hand, Actor, Component);
Pawn->Grab(Hand, Actor);
}
void UPawnKismetLibrary::ReleaseLeft(ASGPawn* Pawn)
@@ -162,13 +162,13 @@ public:
static bool IsGrabbing(const ASGPawn* Pawn, const USGVirtualHandComponent* Hand);
UFUNCTION(BlueprintCallable, Category="SenseGlove | Game Framework | Pawn")
static void GrabLeft(UPARAM(ref) ASGPawn* Pawn, AActor* Actor, UPrimitiveComponent* Component);
static void GrabLeft(UPARAM(ref) ASGPawn* Pawn, AActor* Actor);
UFUNCTION(BlueprintCallable, Category="SenseGlove | Game Framework | Pawn")
static void GrabRight(UPARAM(ref) ASGPawn* Pawn, AActor* Actor, UPrimitiveComponent* Component);
static void GrabRight(UPARAM(ref) ASGPawn* Pawn, AActor* Actor);
UFUNCTION(BlueprintCallable, Category="SenseGlove | Game Framework | Pawn")
void Grab(UPARAM(ref) ASGPawn* Pawn, USGVirtualHandComponent* Hand, AActor* Actor, UPrimitiveComponent* Component);
void Grab(UPARAM(ref) ASGPawn* Pawn, USGVirtualHandComponent* Hand, AActor* Actor);
UFUNCTION(BlueprintCallable, Category="SenseGlove | Game Framework | Pawn")
void ReleaseLeft(UPARAM(ref) ASGPawn* Pawn);