Skip to content
Snippets Groups Projects
Commit 892c6a26 authored by David Gilbert's avatar David Gilbert :bug:
Browse files

Merge branch 'feature/scaling' into '5.4'

Feature/scaling

See merge request !114
parents 1536d61c b53030de
Branches 5.4
No related tags found
1 merge request!114Feature/scaling
Pipeline #555797 passed
......@@ -189,6 +189,9 @@ void UCollisionHandlingMovement::SetCapsuleColliderToUserSize() const
}
CapsuleColliderComponent->SetWorldRotation(FRotator::ZeroRotator);
// Counteract Pawn Scaling
CapsuleColliderComponent->SetWorldScale3D(FVector::One());
}
void UCollisionHandlingMovement::CheckAndRevertCollisionSinceLastTick()
......
......@@ -41,8 +41,26 @@ ARWTHVRPawn::ARWTHVRPawn(const FObjectInitializer& ObjectInitializer) : Super(Ob
LeftHand = CreateDefaultSubobject<UReplicatedMotionControllerComponent>(TEXT("Left Hand MCC"));
LeftHand->SetupAttachment(RootComponent);
UniformScale = GetActorScale3D().X;
GetRootComponent()->TransformUpdated.AddLambda(
[this](USceneComponent*, EUpdateTransformFlags, ETeleportType)
{
FVector CurrentScale = this->GetActorScale3D();
if (CurrentScale.X != UniformScale || CurrentScale.Y != UniformScale || CurrentScale.Z != UniformScale)
{
UE_LOGFMT(Toolkit, Warning,
"ARWTHVRPawn: Do not adjust the scale of the pawn directly. This will not work in VR. Use "
"ARWTHVRPawn::SetScale(float) instead.");
}
});
}
void ARWTHVRPawn::BeginPlay()
{
Super::BeginPlay();
InitialWorldToMeters = GetWorldSettings()->WorldToMeters;
}
void ARWTHVRPawn::BeginPlay() { Super::BeginPlay(); }
void ARWTHVRPawn::Tick(float DeltaSeconds)
{
......@@ -56,6 +74,22 @@ void ARWTHVRPawn::Tick(float DeltaSeconds)
EvaluateLivelink();
}
/*
* Scales the Pawn while also adjusting the WorldToMeters ratio to adjust for pupillary distance.
* Only supports uniform scaling.
*/
void ARWTHVRPawn::SetScale(float NewScale)
{
FVector OldScale = GetActorScale();
UniformScale = NewScale;
FVector NewScaleVector = FVector(UniformScale, UniformScale, UniformScale);
GetWorldSettings()->WorldToMeters = InitialWorldToMeters * UniformScale;
SetActorRelativeScale3D(NewScaleVector);
OnScaleChanged.Broadcast(OldScale, NewScale);
}
float ARWTHVRPawn::GetScale() { return UniformScale; }
/*
* The alternative would be to do this only on the server on possess and check for player state/type,
* as connections now send their playertype over.
......@@ -362,4 +396,4 @@ void ARWTHVRPawn::ApplyLiveLinkTransform(const FTransform& Transform,
HeadCameraComponent->SetRelativeScale3D(Transform.GetScale3D());
}
}
}
}
\ No newline at end of file
......@@ -14,6 +14,8 @@ class UCameraComponent;
class UMotionControllerComponent;
struct FLiveLinkTransformStaticData;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnScaleChangedDelegate, FVector, OldScale, float, NewUniformScale);
/**
* Pawn implementation with additional VR functionality, can be used in the Cave, with an HMD and on desktop.
*/
......@@ -31,6 +33,15 @@ public:
virtual void NotifyControllerChanged() override;
UFUNCTION(BlueprintCallable)
void SetScale(float NewScale);
UFUNCTION(BlueprintCallable)
float GetScale();
UPROPERTY(BlueprintAssignable)
FOnScaleChangedDelegate OnScaleChanged;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Pawn|Input")
TArray<UInputMappingContext*> InputMappingContexts;
......@@ -111,4 +122,6 @@ protected:
private:
UInputComponent* ActivePlayerInputComponent;
float InitialWorldToMeters;
float UniformScale;
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment