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

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