From 7720611ca7be7fca03da6a5b21c09ca8996f91d1 Mon Sep 17 00:00:00 2001 From: Daniel Rupp <daniel.rupp@rwth-aachen.de> Date: Fri, 24 May 2024 16:19:21 +0200 Subject: [PATCH] added scale teleport classes, added buttons to IMC --- .../Movement/Scale/BP_ScalingComponent.uasset | Bin 0 -> 15218 bytes .../Components/Movement/Scale/IA_Grow.uasset | Bin 0 -> 1372 bytes .../Movement/Scale/IA_ResetScale.uasset | Bin 0 -> 1402 bytes .../Movement/Scale/IA_Shrink.uasset | Bin 0 -> 1382 bytes .../Default_IMC/IMC_MovementLeftHand.uasset | Bin 23466 -> 25568 bytes .../Default_IMC/IMC_MovementRightHand.uasset | Bin 23246 -> 29136 bytes .../HeightTeleportationComponent.cpp | 5 + .../Pawn/Navigation/ScalingComponent.cpp | 276 ++++++++++++++++++ .../Navigation/HeightTeleportationComponent.h | 19 ++ .../Public/Pawn/Navigation/ScalingComponent.h | 155 ++++++++++ .../Pawn/Navigation/TeleportationComponent.h | 6 +- Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs | 2 +- 12 files changed, 459 insertions(+), 4 deletions(-) create mode 100644 Content/Components/Movement/Scale/BP_ScalingComponent.uasset create mode 100644 Content/Components/Movement/Scale/IA_Grow.uasset create mode 100644 Content/Components/Movement/Scale/IA_ResetScale.uasset create mode 100644 Content/Components/Movement/Scale/IA_Shrink.uasset create mode 100644 Source/RWTHVRToolkit/Private/Pawn/Navigation/HeightTeleportationComponent.cpp create mode 100644 Source/RWTHVRToolkit/Private/Pawn/Navigation/ScalingComponent.cpp create mode 100644 Source/RWTHVRToolkit/Public/Pawn/Navigation/HeightTeleportationComponent.h create mode 100644 Source/RWTHVRToolkit/Public/Pawn/Navigation/ScalingComponent.h diff --git a/Content/Components/Movement/Scale/BP_ScalingComponent.uasset b/Content/Components/Movement/Scale/BP_ScalingComponent.uasset new file mode 100644 index 0000000000000000000000000000000000000000..1eaae41128a98d480b90e3d5f688d0e91568ac4b GIT binary patch literal 15218 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 literal 0 HcmV?d00001 diff --git a/Content/Components/Movement/Scale/IA_Grow.uasset b/Content/Components/Movement/Scale/IA_Grow.uasset new file mode 100644 index 0000000000000000000000000000000000000000..4fa554d2f3a4358e59810f330ac81f9b1bf5d73a GIT binary patch literal 1372 zcmX@utTpe)|Ns9Jm>C$jm>3v7GBbbyBLf4&+l&oQUOG+r!hOqdk>hSRJq-p1hTAL* z42BF04EjOgAs%5tA^G_^*_kE!&iT0o`FW{%CB^!_`DLlOsd**(!O4j^srsId@$N<W z<zPd(85kJKKqfOVFtjl-FeoxGFc>?Vn_8MWyEs}HI69jfnK)aRSeiLmn3|coS{j%d zS%Ni!6f-d}FsLyzFt9*1KZCmT9Ww(12>)YdV5nN1n`U!xy8F&v?E*^`hKCEk{pvSQ zb#QM;TtBCBt6MP0Zjd=3hp;j*GcYmy^WM)W#K6FytsUxWsvVS?lbTqZs%xre%m9*S zU|6NI2!}k_VGIlmbBi{;1hJJ^7#K8IK`aFR|NsAgP>6x-)IpL1G5zxMQW?H5ALW&0 zU|<MHOwLYBPxZ-9PRz-yN-W9D&+|*nO)V}+OipDGDyi%sE6hu!CmV`@A}ct#D6;?* zOGT-n{z+M>$t4UwJaz5FkmOwRG7|HWQ&T+i3Q9{DuC6=%hK+%N!8s?fxR{}&yka5; z0|NsrE_=JVe(`|#AhnLkAlEVoNhI)aGB7asrj{hSB$gyHJZac68Kep7HHKpM4p9Mw zSK;dB>MTixMkNC%TtK1s_y7O@AiW?qGDcVT=l}oz?8pkBY?wNbgP=kTFfkY(M8m|8 z)q&C%NDdkQ`~UwxG9MH)AU-G^fdT@=2E{Xo#)d)Z4unB+pfmxZkuka$7gQ3IZXBWP z=SU6%nFYd7DHICbEEGvJ4#*6U`@xY8jYv?q!y@_<GXukUsJ$Sy$Z|@!5|19TX&@hf zd=r+KQ<@r5S&+&AGQ%l9KPNRYj{#)2Ut&pSSt=x<*&><goDWZ|dSF>~eP}X9Nvg=U zse=m#kacMO#NdKF1HvE)qDmo9IXV5?(gr>2BNst_k^$*N!e#d?0$EP&*EE2Nfz$&4 DiiHyX literal 0 HcmV?d00001 diff --git a/Content/Components/Movement/Scale/IA_ResetScale.uasset b/Content/Components/Movement/Scale/IA_ResetScale.uasset new file mode 100644 index 0000000000000000000000000000000000000000..096bc1d4cb496f7df83b9d0aff99d70a3aae13e9 GIT binary patch literal 1402 zcmX@utTpe)|Ns9Jm>C$jm>3v7GBbbyBLf4&+l&oQUOG+r!hOqdk>hSRJq-p1hMz19 z4CV|B4EjOgAs%5tA^G_^*_kE!&iT0o`FW{%CB^!_`DLlOsd**(!O4j^srsId@j<D@ zsU=_@*l2DB28J4t`3wvUGng0{6d4#842)fjU7XD<%p8p@%`J@`O${tf-JBiGEnE%V zoZZY!z#2h{nHU%tESMP>SfHAJK-~)#U}0boU}0bgFV|RjOE1@Hb<VeK$)UWrXDzE< zm?&=JI$>+i&ys&$4j{Wh=71c+%D~LP#PH91Kcf%>1B149sH>@VP-;$UVsWajsh%+d zNS=XVmChm@@?eKCFffQMx_24GwqjvmaAO6r5cvQ9|NlYZ2C~x&Ne;yH%g;+?_`-aY zSC)Z+As{h1J25@gCqFqcC$lQCBr`wHFEKZ@xF9h(l|iVavV($<zq-uCLj)9Y!O2CL z1)vx!N)7c-%1TWxVff*xYbS;z=bD$1n3tTI;+a=aTEcL3-RU=M3=9m;If=!^3?=0i z6Zsez7*ON2Aw4IS2P6v8;g}3^IfIZy0uLtx1A}jBNuo<)Ng~6OhAoph5Z+`ccJB}s zK=9$}=ISg-g+(hUj6fmz_y7O@AiW?qGDcVT=l}oz?8pkBY?wNbgP=kTFfkY(M8m|8 z)q&C)NDdkQ`~UwxG9MH`AU-HffdT@=2E{pu#)d&@5QIT;p!5Nvkuka$7gQ3Ih8&@6 zR#@OLFff430%52W3WaVKiX<8bWCqCn;HZa2BxZE8urM&Zg$4^q2c`-oT**lf*<_G! zKt2mg%qdL`sVqok0L8IWetu4BVjcs?9e#-=nPsVvq-Tp{rgJ_#`RajX)%BqX8zu1~ z+oldKBS6-n`5A)?@)8JxB#0`VK&9yPZ%Z5WtdCp-`AG((6A72yvj}84wO`W!Dh5&y E0RF-p8vp<R literal 0 HcmV?d00001 diff --git a/Content/Components/Movement/Scale/IA_Shrink.uasset b/Content/Components/Movement/Scale/IA_Shrink.uasset new file mode 100644 index 0000000000000000000000000000000000000000..2ef23e85a28e3f50da12c5a84bfa92f1367c2e57 GIT binary patch literal 1382 zcmX@utTpe)|Ns9Jm>C$jm>3v7GBbbyBLf4&+l&oQUOG+r!hOqdk>hSRJq-p1hNmnH z48{x$4EjOgAs%5tA^G_^*_kE!&iT0o`FW{%CB^!_`DLlOsd**(!O4j^srsId@xd8I znR(e@W4Rd^7%D(!GcYjpFflMFGB7YWJ3E_M7`mD|8k!hcn43Bqxw;q|xj8yom>C!t z7+bi4HG&i~F)%RbFf%Z)KsCRCy7db)0|N-NurM%uFrT6r^KQ4#3_A|{vmXzvKFafP z+g1fnzkQPe^v$PBtpwQ(G6&=kRt9DUCWe3B`x%887#Os*LtRa^gHm%+6N^)IP4$c! zK=KR>t8^COkOw=Afq|jX@8w?*TZ@H(!H5;aLg4@Z|NjSt8OTmEBsmb%FF!Ap;S2Lo zUReePhJeK6?8Nj`pZw&+oXo1klFa-(zr@_s;)2BFR0g4v$__F^T}sF<P6QNT!O2CL z1)!KJN)7c-%1TWxVff*xYbS;z=bD$1n3tTI;+a=aTEcL3-RU=Mp!ms2EG}j!DX*Bw z#lXOTh|l|K_cD1vA|Ta{$siXq2uURHa56A3_@<U5x+In)GCXP6GMNM6J%(cU4p9LF zAFgh$&XQDUbTWX#1{8vS|Ns9F(hFiEV{~<Y{{R2aj;sL6hN%NN2r9$?6NB+VG)xRx z9Vm@~<dE^d|Ns9Z^Fe_F;)Bu>C?G&=P+Ws(Y#5aGKo}$kN*5p+8KaAVf*T|cN;{4q z1_J}bM<j=V%mQJk6bglI7K$Vq2V@4w{orVaMkL5?L{$G^W?;ApwHc%uRaOaC64FC9 z5#$SyzOclc($tX3f>Z`j+&bmw=cFd)F@Ws%ODxGOOLYb(H(Mk#o%7*IRu3$zt`AMj zC<zwXHg#|z0kRIwuNYjAcR&~<K~!l3Dlw;jTiT#!edHp@Pck5#NVx2tMIg(m{h9_) HF_3xy%<dNb literal 0 HcmV?d00001 diff --git a/Content/Input/Default_IMC/IMC_MovementLeftHand.uasset b/Content/Input/Default_IMC/IMC_MovementLeftHand.uasset index 3a6f11f161b72dcf7957b8badedca6df9f64ec20..a688bcc47ef30ebaeeb28592df4a0c2c00ee4c68 100644 GIT binary patch literal 25568 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 OWI4586IP9Y)B^z40k3ZW literal 23466 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 diff --git a/Content/Input/Default_IMC/IMC_MovementRightHand.uasset b/Content/Input/Default_IMC/IMC_MovementRightHand.uasset index 3aeafce240b599eb78bc9305707d2198bfd53613..aa1f8437dcb5cb367674b6c27fc1a84357dac27a 100644 GIT binary patch literal 29136 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 E0BmY;)Bpeg literal 23246 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 diff --git a/Source/RWTHVRToolkit/Private/Pawn/Navigation/HeightTeleportationComponent.cpp b/Source/RWTHVRToolkit/Private/Pawn/Navigation/HeightTeleportationComponent.cpp new file mode 100644 index 00000000..5741ec92 --- /dev/null +++ b/Source/RWTHVRToolkit/Private/Pawn/Navigation/HeightTeleportationComponent.cpp @@ -0,0 +1,5 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Pawn/Navigation/HeightTeleportationComponent.h" + diff --git a/Source/RWTHVRToolkit/Private/Pawn/Navigation/ScalingComponent.cpp b/Source/RWTHVRToolkit/Private/Pawn/Navigation/ScalingComponent.cpp new file mode 100644 index 00000000..b5ce4119 --- /dev/null +++ b/Source/RWTHVRToolkit/Private/Pawn/Navigation/ScalingComponent.cpp @@ -0,0 +1,276 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Pawn/Navigation/ScalingComponent.h" + +#include "EnhancedInputComponent.h" +#include "HeadMountedDisplayFunctionLibrary.h" +#include "MotionControllerComponent.h" +#include "EntitySystem/MovieSceneComponentDebug.h" +#include "Pawn/RWTHVRPawn.h" +#include "Utility/RWTHVRUtilities.h" + + + +void UScalingComponent::BeginPlay() +{ + Super::BeginPlay(); + + MotionController = VRPawn->RightHand; + + ScalingDelegate.AddDynamic(this, &UScalingComponent::AdjustFeedbackMesh); + + FloatingPawnMovement = Cast<UFloatingPawnMovement>(VRPawn->GetMovementComponent()); + if(!FloatingPawnMovement) + { + UE_LOG(Toolkit,Error,TEXT("[ScalingComponent]: Cannot find FloatingPawnMovement at VRPawn")) + } + + DefaultAcceleration = FloatingPawnMovement->Acceleration; + DefaultDeceleration = FloatingPawnMovement->Deceleration; + DefaultMaxSpeed = FloatingPawnMovement->MaxSpeed; + + // Spawn the feedback meshes that indicate the current size in relation to the original size + FActorSpawnParameters Params; + + OriginalSizeMesh = GetWorld()->SpawnActor<AStaticMeshActor>(Params); + OriginalSizeMesh->GetStaticMeshComponent()->Mobility = EComponentMobility::Movable; + OriginalSizeMesh->SetMobility(EComponentMobility::Movable); + FVector LocationAboveController = MotionController->GetComponentLocation(); + LocationAboveController += MotionController->GetUpVector() * 10; + LocationAboveController += MotionController->GetForwardVector() * 15; + LocationAboveController += MotionController->GetRightVector() * FeedbackMeshDistance / 2.f; + OriginalSizeMesh->SetActorLocation(LocationAboveController); + + + OriginalSizeMesh->GetStaticMeshComponent()->SetStaticMesh(FeedbackMesh); + OriginalSizeMesh->SetActorScale3D(FVector(0.1, 0.1, 0.1)); + + OriginalSizeMesh->GetStaticMeshComponent()->AttachToComponent(MotionController, + FAttachmentTransformRules( + EAttachmentRule::KeepWorld, + EAttachmentRule::KeepRelative, + EAttachmentRule::KeepRelative, false)); + + CurrentSizeMesh = GetWorld()->SpawnActor<AStaticMeshActor>(Params); + CurrentSizeMesh->GetStaticMeshComponent()->Mobility = EComponentMobility::Movable; + CurrentSizeMesh->SetMobility(EComponentMobility::Movable); + LocationAboveController = MotionController->GetComponentLocation(); + LocationAboveController += MotionController->GetUpVector() * 10; + LocationAboveController += MotionController->GetForwardVector() * 15; + LocationAboveController -= MotionController->GetRightVector() * FeedbackMeshDistance / 2.f; + CurrentSizeMesh->SetActorLocation(LocationAboveController); + + + CurrentSizeMesh->GetStaticMeshComponent()->SetStaticMesh(FeedbackMesh); + CurrentSizeMesh->SetActorScale3D(FVector(0.1, 0.1, 0.1)); + + CurrentSizeMesh->GetStaticMeshComponent()->AttachToComponent(MotionController, + FAttachmentTransformRules( + EAttachmentRule::KeepWorld, + EAttachmentRule::KeepRelative, + EAttachmentRule::KeepWorld, false)); + + // Disable collisions of preview meshes + OriginalSizeMesh->SetActorEnableCollision(false); + CurrentSizeMesh->SetActorEnableCollision(false); + + // Correct rotation of meshes + FRotator Corrector = FRotator(0, 90, 0); + OriginalSizeMesh->AddActorLocalRotation(Corrector); + CurrentSizeMesh->AddActorLocalRotation(Corrector); + + // Add controllers as equal sized components so thei scale accordingly + + AddEqualSizedComponent(VRPawn->LeftHand); + AddEqualSizedComponent(VRPawn->RightHand); + +} + +void UScalingComponent::SetupPlayerInput(UInputComponent* PlayerInputComponent) +{ + Super::SetupPlayerInput(PlayerInputComponent); + + + if (!VRPawn || !VRPawn->HasLocalNetOwner()) + { + return; + } + + UEnhancedInputComponent* EI = Cast<UEnhancedInputComponent>(PlayerInputComponent); + if (!EI) + { + UE_LOG(Toolkit, Error, TEXT("Cannot cast Input Component to Enhanced Input Component in ScalingComponent")); + return; + } + + // teleporting + EI->BindAction(Grow, ETriggerEvent::Completed, this, &UScalingComponent::OnGrow); + EI->BindAction(Shrink, ETriggerEvent::Completed, this, &UScalingComponent::OnShrink); + EI->BindAction(ResetScale, ETriggerEvent::Completed, this, &UScalingComponent::OnResetScale); + // turning is defined in MovementComponentBase +} + +void UScalingComponent::OnGrow(const FInputActionValue& InputActionValue) +{ + float CurrentW2MScale = UHeadMountedDisplayFunctionLibrary::GetWorldToMetersScale(GetOwner()->GetWorld()); + float PreviousScale = CurrentW2MScale; // store for computing scale ratio + + CurrentW2MScale = CurrentW2MScale * (1 + ScaleStepSize); + GNearClippingPlane = CurrentW2MScale; + + FloatingPawnMovement->Acceleration = DefaultAcceleration * CurrentW2MScale/100; + FloatingPawnMovement->Deceleration = DefaultDeceleration* CurrentW2MScale/100; + FloatingPawnMovement->MaxSpeed = DefaultMaxSpeed * CurrentW2MScale/100; + + if (CurrentW2MScale > MaxScale || CurrentW2MScale < MinScale) + { + UE_LOG(LogTemp, Warning, TEXT("Exceeding scale limits!")); + return; + } + + CurrentW2MScale = FMath::Clamp(CurrentW2MScale, MinScale, MaxScale); + // min and max are swapped here due to the inverse nature of the WorldToMeterScale attribute + float ScaleRatio = CurrentW2MScale / PreviousScale; + + AdjustEqualSizedWorldObjects(ScaleRatio); + UHeadMountedDisplayFunctionLibrary::SetWorldToMetersScale(GetOwner()->GetWorld(), CurrentW2MScale); + // inform all subscribed actors of the scale change + ScalingDelegate.Broadcast(ScaleRatio, false, VRPawn->GetActorLocation()); + + //DrawDebugSphere(GetWorld(), ParentActor->GetActorLocation(), 15, 15, FColor::Red, false, 10); +} + +void UScalingComponent::OnShrink(const FInputActionValue& InputActionValue) +{ + float CurrentW2MScale = UHeadMountedDisplayFunctionLibrary::GetWorldToMetersScale(GetOwner()->GetWorld()); + float PreviousScale = CurrentW2MScale; // store for computing scale ratio + CurrentW2MScale = CurrentW2MScale / (1.f + ScaleStepSize); + + GNearClippingPlane = CurrentW2MScale; + FloatingPawnMovement->Acceleration = DefaultAcceleration * CurrentW2MScale/100; + FloatingPawnMovement->Deceleration = DefaultDeceleration * CurrentW2MScale/100; + FloatingPawnMovement->MaxSpeed = DefaultMaxSpeed * CurrentW2MScale/100; + + if (CurrentW2MScale > MaxScale || CurrentW2MScale < MinScale) + { + UE_LOG(LogTemp, Warning, TEXT("Exceeding scale limits!")); + return; + } + + CurrentW2MScale = FMath::Clamp(CurrentW2MScale, MinScale, MaxScale); + // min and max are swapped here due to the inverse nature of the WorldToMeterScale attribute + float ScaleRatio = CurrentW2MScale / PreviousScale; + + AdjustEqualSizedWorldObjects(ScaleRatio); + UHeadMountedDisplayFunctionLibrary::SetWorldToMetersScale(GetOwner()->GetWorld(), CurrentW2MScale); + // inform all subscribed actors of the scale change + ScalingDelegate.Broadcast(ScaleRatio, false, VRPawn->GetActorLocation()); + + + //DrawDebugSphere(GetWorld(), ParentActor->GetActorLocation(), 15, 15, FColor::Red, true, 10); +} + +void UScalingComponent::OnResetScale(const FInputActionValue& InputActionValue) +{ + UE_LOG(LogTemp, Error, TEXT("Resetting Scale")); + + float CurrentW2MScale = UHeadMountedDisplayFunctionLibrary::GetWorldToMetersScale(GetOwner()->GetWorld()); + float PreviousScale = CurrentW2MScale; // store for computing scale ratio + CurrentW2MScale = OriginalScale; + GNearClippingPlane = CurrentW2MScale; + + FloatingPawnMovement->Acceleration = DefaultAcceleration * CurrentW2MScale/100; + FloatingPawnMovement->Deceleration = DefaultDeceleration * CurrentW2MScale/100; + FloatingPawnMovement->MaxSpeed = DefaultMaxSpeed * CurrentW2MScale/100; + + CurrentW2MScale = FMath::Clamp(CurrentW2MScale, MinScale, MaxScale); + // min and max are swapped here due to the inverse nature of the WorldToMeterScale attribute + float ScaleRatio = CurrentW2MScale / PreviousScale; + + AdjustEqualSizedWorldObjects(ScaleRatio); + UHeadMountedDisplayFunctionLibrary::SetWorldToMetersScale(GetOwner()->GetWorld(), CurrentW2MScale); + + // Scale the visualizer + + //CurrentSizeMesh->SetActorScale3D(FVector(0.1,0.1,0.1)); + + // inform all subscribed actors of the scale change + ScalingDelegate.Broadcast(ScaleRatio, true, VRPawn->GetActorLocation()); + //ScalingResetDelegate.Broadcast(); +} + +float UScalingComponent::GetTotalScaleRatio() +{ + return OriginalScale / UHeadMountedDisplayFunctionLibrary::GetWorldToMetersScale(GetOwner()->GetWorld()); +} + +void UScalingComponent::AddEqualSizedActor(AActor* ActorToKeepEqual) +{ + if (ActorToKeepEqual != nullptr) + { + EqualSizedActors.AddUnique(ActorToKeepEqual); + } + else + { + UE_LOG(LogTemp, Fatal, TEXT("No valid actor was passed to method AddEqualSizedActor()!")); + } +} + +void UScalingComponent::AddEqualSizedComponent(USceneComponent* SceneComponentToKeepEqual) +{ + if (SceneComponentToKeepEqual != nullptr) + { + EqualSizedSceneComponents.AddUnique(SceneComponentToKeepEqual); + } + else + { + UE_LOG(LogTemp, Fatal, TEXT("No valid USceneComponent was passed to method AddEqualSizedComponent() !")); + } +} + +void UScalingComponent::AdjustEqualSizedWorldObjects(float ScaleRatio) +{ + // adjust actors + for (AActor* CurrActor : EqualSizedActors) + { + //UE_LOG(LogTemp, Warning, TEXT("Scaling Actor")); + FVector CurrentScaling = CurrActor->GetActorScale3D(); + CurrActor->SetActorScale3D(CurrentScaling * ScaleRatio); + } + + // adjust scene components + for (USceneComponent* CurrComponent : EqualSizedSceneComponents) + { + //UE_LOG(LogTemp, Warning, TEXT("Scaling Component")); + FVector CurrentScaling = CurrComponent->GetComponentScale(); + CurrComponent->SetWorldScale3D(CurrentScaling * ScaleRatio); + } +} + +void UScalingComponent::AdjustFeedbackMesh(float NewWMSRation, bool isReset, FVector NewPos) +{ + TotalScaleRatio *= NewWMSRation; + + FVector Scale = CurrentSizeMesh->GetActorScale3D(); + Scale *= NewWMSRation; + CurrentSizeMesh->SetActorScale3D(Scale); + + ControllerUpOffset *= NewWMSRation; + ControllerForwardOffset *= NewWMSRation; + FeedbackMeshDistance *= NewWMSRation; + + FVector LocationAboveController = MotionController->GetComponentLocation(); + LocationAboveController += + MotionController->GetUpVector() * ControllerUpOffset; + LocationAboveController += + MotionController->GetForwardVector() * ControllerForwardOffset; + LocationAboveController += + MotionController->GetRightVector() * FeedbackMeshDistance / 2.f; + OriginalSizeMesh->SetActorLocation(LocationAboveController); + + LocationAboveController -= + MotionController->GetRightVector() * FeedbackMeshDistance; + CurrentSizeMesh->SetActorLocation(LocationAboveController); +} + diff --git a/Source/RWTHVRToolkit/Public/Pawn/Navigation/HeightTeleportationComponent.h b/Source/RWTHVRToolkit/Public/Pawn/Navigation/HeightTeleportationComponent.h new file mode 100644 index 00000000..cfe56742 --- /dev/null +++ b/Source/RWTHVRToolkit/Public/Pawn/Navigation/HeightTeleportationComponent.h @@ -0,0 +1,19 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Pawn/Navigation/MovementComponentBase.h" +#include "HeightTeleportationComponent.generated.h" + +/** + * + */ +UCLASS() +class RWTHVRTOOLKIT_API UHeightTeleportationComponent : public UMovementComponentBase +{ + GENERATED_BODY() + + // Spawn the TwoStepHandler etc. (Basically what was done in the VRPawn directly) + +}; diff --git a/Source/RWTHVRToolkit/Public/Pawn/Navigation/ScalingComponent.h b/Source/RWTHVRToolkit/Public/Pawn/Navigation/ScalingComponent.h new file mode 100644 index 00000000..39f26c9c --- /dev/null +++ b/Source/RWTHVRToolkit/Public/Pawn/Navigation/ScalingComponent.h @@ -0,0 +1,155 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "InputActionValue.h" +#include "Engine/StaticMeshActor.h" +#include "GameFramework/FloatingPawnMovement.h" +#include "GameFramework/MovementComponent.h" +#include "Pawn/Navigation/MovementComponentBase.h" +#include "ScalingComponent.generated.h" + +/** + * + */ +UCLASS(Blueprintable) +class RWTHVRTOOLKIT_API UScalingComponent : public UMovementComponentBase +{ + GENERATED_BODY() + +public: + virtual void SetupPlayerInput(UInputComponent* PlayerInputComponent) override; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VR Movement") + bool bMoveWithRightHand = true; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "VR Movement|Input|Actions") + UInputAction* Grow; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "VR Movement|Input|Actions") + UInputAction* Shrink; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "VR Movement|Input|Actions") + UInputAction* ResetScale; + + UFUNCTION(BlueprintCallable) + void OnGrow(const FInputActionValue& InputActionValue); + UFUNCTION(BlueprintCallable) + void OnShrink(const FInputActionValue& InputActionValue); + UFUNCTION(BlueprintCallable) + void OnResetScale(const FInputActionValue& InputActionValue); + + + + // code from marius: + UFUNCTION(BlueprintCallable) + void SetMaxScale(float UpperLimit) + { + MaxScale = UpperLimit; + } + + UFUNCTION(BlueprintCallable) + void SetMinScale(float LowerLimit) + { + MinScale = LowerLimit; + } + + UFUNCTION(BlueprintCallable) + void SetStepSize(float StepSize) + { + ScaleStepSize = StepSize; + } + + UFUNCTION(BlueprintCallable) + float GetStepSize() + { + return ScaleStepSize; + } + + float GetTotalScaleRatio(); + + + UFUNCTION(BlueprintCallable) + void AddEqualSizedActor(AActor* ActorToKeepEqual); + + UFUNCTION(BlueprintCallable) + void AddEqualSizedComponent(USceneComponent* SceneComponentToKeepEqual); + + void AdjustEqualSizedWorldObjects(float ScaleRatio); + + UFUNCTION() + void AdjustFeedbackMesh(float NewWMSRation, bool isReset = true, FVector NewPos = FVector::Zero()); + + void SetFeedbackMesh(UStaticMesh* NewMesh) + { + FeedbackMesh = NewMesh; + OriginalSizeMesh->GetStaticMeshComponent()->SetStaticMesh(FeedbackMesh); + CurrentSizeMesh->GetStaticMeshComponent()->SetStaticMesh(FeedbackMesh); + } + + // Scaling Delegate that other actors can subscribe to + DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FScalingDelegate, float, NewWorldScaling, bool, isReset, FVector, + AdjustedPawnLocation); + + UPROPERTY(BlueprintAssignable) + FScalingDelegate ScalingDelegate; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE(FScalingResetDelegate); + + UPROPERTY(BlueprintAssignable) + FScalingResetDelegate ScalingResetDelegate; + + UPROPERTY(EditAnywhere) + UMotionControllerComponent* MotionController = nullptr; + + UPROPERTY(EditAnywhere) + TArray<AActor*> EqualSizedActors; + + UPROPERTY(EditAnywhere) + TArray<USceneComponent*> EqualSizedSceneComponents; + + + //Boundaries of Scaling (inverse relation: Increasing the WorldToMeterScale decreases the pawns size (as the world increases)) + UPROPERTY(EditAnywhere) + float MinScale = 10; + + UPROPERTY(EditAnywhere) + float MaxScale = 350; + + UPROPERTY(EditAnywhere) + float ScaleStepSize = 0.2; +protected: + + // Called when the game starts + virtual void BeginPlay() override; + + +private: + + UPROPERTY() + float OriginalScale = 100; + + float TotalScaleRatio = 1; + + // Components For Visual Feedback + UPROPERTY(EditAnywhere) + UStaticMesh* FeedbackMesh = nullptr; + UPROPERTY(EditAnywhere) + AStaticMeshActor* OriginalSizeMesh = nullptr; + UPROPERTY(EditAnywhere) + AStaticMeshActor* CurrentSizeMesh = nullptr; + float FeedbackMeshDistance = 15; + float ControllerForwardOffset = 15; + float ControllerUpOffset = 10; + + // boolean for scaling behaviour + bool bHasScaled = false; + + UFloatingPawnMovement* FloatingPawnMovement; + float DefaultAcceleration; + float DefaultDeceleration; + float DefaultMaxSpeed; +}; + + diff --git a/Source/RWTHVRToolkit/Public/Pawn/Navigation/TeleportationComponent.h b/Source/RWTHVRToolkit/Public/Pawn/Navigation/TeleportationComponent.h index 30863464..04fbe704 100644 --- a/Source/RWTHVRToolkit/Public/Pawn/Navigation/TeleportationComponent.h +++ b/Source/RWTHVRToolkit/Public/Pawn/Navigation/TeleportationComponent.h @@ -60,6 +60,8 @@ public: virtual void SetupPlayerInput(UInputComponent* PlayerInputComponent) override; + UPROPERTY(BlueprintReadOnly) + AActor* TeleportVisualizer; private: UPROPERTY() UMotionControllerComponent* TeleportationHand; @@ -73,7 +75,5 @@ private: FPredictProjectilePathResult PredictResult; bool bValidTeleportLocation = false; FVector FinalTeleportLocation; - - UPROPERTY() - AActor* TeleportVisualizer; + }; diff --git a/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs b/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs index 930dc912..6eb52144 100644 --- a/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs +++ b/Source/RWTHVRToolkit/RWTHVRToolkit.Build.cs @@ -38,7 +38,7 @@ public class RWTHVRToolkit : ModuleRules PrivateDependencyModuleNames.AddRange( new string[] { - "NetCore" + "NetCore", "XRBase", "XRBase" } ); if (Target.bBuildEditor == true) -- GitLab