diff --git a/Source/RWTHVRToolkit/Private/Interaction/Interactables/IntenSelect/IntenSelectable.cpp b/Source/RWTHVRToolkit/Private/Interaction/Interactables/IntenSelect/IntenSelectable.cpp
index 3cd0e3d97f05cd11f45f107103511fa3ec28c48a..6b64f64bec66a6018cd5bfa951ae3234a673998d 100644
--- a/Source/RWTHVRToolkit/Private/Interaction/Interactables/IntenSelect/IntenSelectable.cpp
+++ b/Source/RWTHVRToolkit/Private/Interaction/Interactables/IntenSelect/IntenSelectable.cpp
@@ -1,7 +1,6 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "Interaction/Interactables/IntenSelect/IntenSelectable.h"
-
#include "Interaction/Interactables/IntenSelect/IntenSelectableScoring.h"
#include "Interaction/Interactables/IntenSelect/IntenSelectableSinglePointScoring.h"
#include "Kismet/KismetSystemLibrary.h"
@@ -16,8 +15,44 @@ TPair<FHitResult, float> UIntenSelectable::GetBestPointScorePair(const FVector&
const float ConeAngle, const float LastValue,
const float DeltaTime) const
{
- checkf(ScoringBehaviour, TEXT("%s"), *GetOwner()->GetName()) return ScoringBehaviour->GetBestPointScorePair(
- ConeOrigin, ConeForwardDirection, ConeBackwardShiftDistance, ConeAngle, LastValue, DeltaTime);
+ checkf(ScoringBehaviours.Num() > 0, TEXT("%s"), *GetOwner()->GetName());
+
+ float MaxScore = -1;
+ FHitResult MaxResult;
+
+ for (UIntenSelectableScoring* s : ScoringBehaviours)
+ {
+ const TPair<FHitResult, float> Score_Pair = s->GetBestPointScorePair(
+ ConeOrigin, ConeForwardDirection, ConeBackwardShiftDistance, ConeAngle, LastValue, DeltaTime);
+
+ if (Score_Pair.Value >= MaxScore)
+ {
+ MaxResult = Score_Pair.Key;
+ MaxScore = Score_Pair.Value;
+ }
+ }
+ return TPair<FHitResult, float>{MaxResult, MaxScore};
+}
+
+void UIntenSelectable::BeginPlay()
+{
+ Super::BeginPlay();
+
+ TInlineComponentArray<UIntenSelectable*> AttachedIntenSelectables;
+ GetOwner()->GetComponents(AttachedIntenSelectables, false);
+
+ if (AttachedIntenSelectables.Num() > 1)
+ {
+ if (!ScoringBehaviours.Num() == 0)
+ {
+ ShowErrorAndQuit(
+ "Please assign the Scoring Behaviour manually when using more than one IntenSelectable Component!");
+ }
+ }
+ else
+ {
+ InitDefaultBehaviourReferences();
+ }
}
void UIntenSelectable::HandleOnSelectStartEvents(const UIntenSelectComponent* IntenSelect, const FHitResult& HitResult)
@@ -58,18 +93,24 @@ void UIntenSelectable::HandleOnClickEndEvents(UIntenSelectComponent* IntenSelect
void UIntenSelectable::InitDefaultBehaviourReferences()
{
// Scoring
- if (UIntenSelectableScoring* AttachedScoring =
- Cast<UIntenSelectableScoring>(GetOwner()->GetComponentByClass(UIntenSelectableScoring::StaticClass())))
+
+ for (TSet<UActorComponent*> AllComponents = GetOwner()->GetComponents(); UActorComponent * c : AllComponents)
{
- ScoringBehaviour = AttachedScoring;
+ if (UIntenSelectableScoring* TryToGetScoring = Cast<UIntenSelectableScoring>(c))
+ {
+ ScoringBehaviours.Add(TryToGetScoring);
+ }
}
- else
+
+ if (ScoringBehaviours.Num() == 0)
{
- ScoringBehaviour = NewObject<UIntenSelectableSinglePointScoring>(
+ const auto InitScoringBehaviour = NewObject<UIntenSelectableSinglePointScoring>(
this, UIntenSelectableSinglePointScoring::StaticClass(), "Default Scoring");
- ScoringBehaviour->SetWorldLocation(GetOwner()->GetActorLocation());
- ScoringBehaviour->AttachToComponent(GetOwner()->GetRootComponent(),
- FAttachmentTransformRules::SnapToTargetNotIncludingScale);
+ InitScoringBehaviour->SetWorldLocation(GetOwner()->GetActorLocation());
+ InitScoringBehaviour->AttachToComponent(GetOwner()->GetRootComponent(),
+ FAttachmentTransformRules::SnapToTargetNotIncludingScale);
+
+ ScoringBehaviours.Add(InitScoringBehaviour);
}
// Selecting
@@ -93,24 +134,3 @@ void UIntenSelectable::ShowErrorAndQuit(const FString& Message) const
#endif
UKismetSystemLibrary::QuitGame(this, nullptr, EQuitPreference::Quit, false);
}
-
-void UIntenSelectable::BeginPlay()
-{
- Super::BeginPlay();
-
- TInlineComponentArray<UIntenSelectable*> AttachedIntenSelectables;
- GetOwner()->GetComponents(AttachedIntenSelectables, false);
-
- if (AttachedIntenSelectables.Num() > 1)
- {
- if (!ScoringBehaviour)
- {
- ShowErrorAndQuit(
- "Please assign the Scoring Behaviour manually when using more than one IntenSelectable Component!");
- }
- }
- else
- {
- InitDefaultBehaviourReferences();
- }
-}
diff --git a/Source/RWTHVRToolkit/Public/Interaction/Interactables/IntenSelect/IntenSelectable.h b/Source/RWTHVRToolkit/Public/Interaction/Interactables/IntenSelect/IntenSelectable.h
index ea8fccb95d7a1fad3a1a5e87ed78ea2a50c90861..45e6a7726227e26c299399ba733a143909ae32b7 100644
--- a/Source/RWTHVRToolkit/Public/Interaction/Interactables/IntenSelect/IntenSelectable.h
+++ b/Source/RWTHVRToolkit/Public/Interaction/Interactables/IntenSelect/IntenSelectable.h
@@ -5,6 +5,8 @@
#include "CoreMinimal.h"
#include "InputActionValue.h"
#include "Components/ActorComponent.h"
+#include "Interaction/Interactables/ActionBehaviour.h"
+#include "Interaction/Interactables/HoverBehaviour.h"
#include "IntenSelectable.generated.h"
@@ -23,7 +25,7 @@ public:
bool IsSelectable = true;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
- UIntenSelectableScoring* ScoringBehaviour;
+ TArray<UIntenSelectableScoring*> ScoringBehaviours;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<UHoverBehaviour*> OnSelectBehaviours;