Skip to content
Snippets Groups Projects

Feature/targetable leave and enter event

Closed Jan Delember requested to merge feature/TargetableLeaveAndEnterEvent into develop
1 file
+ 63
64
Compare changes
  • Side-by-side
  • Inline
// Fill out your copyright notice in the Description page of Project Settings.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#pragma once
#include "CoreMinimal.h"
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Components/ActorComponent.h"
#include "BasicVRInteractionComponent.generated.h"
#include "BasicVRInteractionComponent.generated.h"
class UGrabbingBehaviorComponent;
class UGrabbingBehaviorComponent;
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class DISPLAYCLUSTEREXTENSIONS_API UBasicVRInteractionComponent : public UActorComponent
class DISPLAYCLUSTEREXTENSIONS_API UBasicVRInteractionComponent : public UActorComponent
{
{
GENERATED_BODY()
GENERATED_BODY()
public:
public:
// Sets default values for this component's properties
// Sets default values for this component's properties
UBasicVRInteractionComponent();
UBasicVRInteractionComponent();
UFUNCTION(BlueprintCallable) void BeginInteraction();
UFUNCTION(BlueprintCallable) void BeginInteraction();
UFUNCTION(BlueprintCallable) void EndInteraction();
UFUNCTION(BlueprintCallable) void EndInteraction();
// Called every frame
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
UPROPERTY(BlueprintReadWrite) float MaxGrabDistance = 50;
UPROPERTY(BlueprintReadWrite) float MaxGrabDistance = 50;
UPROPERTY(BlueprintReadWrite) float MaxClickDistance = 500;
UPROPERTY(BlueprintReadWrite) float MaxClickDistance = 500;
// Enable this if you want to interact with Targetable classes
// Enable this if you want to interact with Targetable classes
UPROPERTY(EditAnywhere) bool bCanRaytraceEveryTick = false;
UPROPERTY(EditAnywhere) bool bCanRaytraceEveryTick = false;
UFUNCTION(BlueprintCallable) void Initialize(USceneComponent* RayEmitter, float InMaxGrabDistance = 50, float InMaxClickDistance = 500);
UFUNCTION(BlueprintCallable) void Initialize(USceneComponent* RayEmitter, float InMaxGrabDistance = 50, float InMaxClickDistance = 500);
UFUNCTION(BlueprintCallable, BlueprintPure) AActor* GetGrabbedActor() const { return GrabbedActor;}
UFUNCTION(BlueprintCallable, BlueprintPure) AActor* GetGrabbedActor() const { return GrabbedActor;}
UFUNCTION(BlueprintCallable, BlueprintPure) USceneComponent* GetInteractionRayEmitter() const { return InteractionRayEmitter; }
UFUNCTION(BlueprintCallable, BlueprintPure) USceneComponent* GetInteractionRayEmitter() const { return InteractionRayEmitter; }
private:
private:
/* Holding a reference to the actor that is currently being grabbed */
/* Holding a reference to the actor that is currently being grabbed */
UPROPERTY() AActor* GrabbedActor;
UPROPERTY() AActor* GrabbedActor;
/* Holds a reference to the grabbed actors physics simulating component if there was one*/
/* Holds a reference to the grabbed actors physics simulating component if there was one*/
UPROPERTY() UPrimitiveComponent* ComponentSimulatingPhysics = nullptr;
UPROPERTY() UPrimitiveComponent* ComponentSimulatingPhysics = nullptr;
UPROPERTY() UGrabbingBehaviorComponent* Behavior = nullptr;
UPROPERTY() UGrabbingBehaviorComponent* Behavior = nullptr;
UPROPERTY() USceneComponent* InteractionRayEmitter = nullptr;
UPROPERTY() USceneComponent* InteractionRayEmitter = nullptr;
UPROPERTY() UStaticMeshComponent* InteractionRay = nullptr;
/* Stores the reference of the Actor that was hit in the last frame*/
/* Stores the reference of the Actor that was hit in the last frame*/
UPROPERTY() AActor* LastActorHit = nullptr;
UPROPERTY() AActor* LastActorHit = nullptr;
void HandlePhysicsAndAttachActor(AActor* HitActor);
void HandlePhysicsAndAttachActor(AActor* HitActor);
FTwoVectors GetHandRay(float Length) const;
FTwoVectors GetHandRay(float Length) const;
TOptional<FHitResult> RaytraceForFirstHit(const FTwoVectors& Ray) const;
TOptional<FHitResult> RaytraceForFirstHit(const FTwoVectors& Ray) const;
};
};
// Free utility functions
// Free utility functions
/*
/*
Returns the UPrimitiveComponent simulating physics that is highest in the hierarchy
Returns the UPrimitiveComponent simulating physics that is highest in the hierarchy
*/
*/
UPrimitiveComponent* GetFirstComponentSimulatingPhysics(const AActor* TargetActor);
UPrimitiveComponent* GetFirstComponentSimulatingPhysics(const AActor* TargetActor);
/*
/*
Recursive Function
Recursive Function
If parent component simulates physics returns GetHighestParentSimulatingPhysics(Parent)
If parent component simulates physics returns GetHighestParentSimulatingPhysics(Parent)
else returns Comp itself
else returns Comp itself
*/
*/
UPrimitiveComponent* GetHighestParentSimulatingPhysics(UPrimitiveComponent* Comp);
UPrimitiveComponent* GetHighestParentSimulatingPhysics(UPrimitiveComponent* Comp);
Loading