Skip to content
Snippets Groups Projects

Hotfix: Modifies CaveOverlay to be able to handle Pawn changes

Files

@@ -149,6 +149,10 @@ void ACAVEOverlayController::BeginPlay()
if (GetNetMode() != NM_Standalone)
return;
// If we're not in room-mounted mode, return as well
if (!URWTHVRClusterUtilities::IsRoomMountedMode())
return;
// This should return the respective client's local playercontroller or, if we're a listen server, our own PC.
auto* PC = GetWorld() ? GetWorld()->GetFirstPlayerController() : nullptr;
@@ -157,9 +161,9 @@ void ACAVEOverlayController::BeginPlay()
// Not sure which place would be best...
const bool bValidPC = PC && PC->GetLocalPlayer();
if (!bValidPC || !URWTHVRClusterUtilities::IsRoomMountedMode())
if (!bValidPC)
return;
// Input config
if (URWTHVRClusterUtilities::IsPrimaryNode())
{
@@ -223,11 +227,36 @@ void ACAVEOverlayController::BeginPlay()
return;
}
PC->OnPossessedPawnChanged.AddUniqueDynamic(this, &ACAVEOverlayController::UpdatePossessedPawn);
// I think this breaks in multiplayer mode
InitFromPawn(PC->GetPawn());
// Create dynamic material for tape
TapeMaterialDynamic = Tape->CreateDynamicMaterialInstance(0);
UE_LOGFMT(LogCAVEOverlay, Display, "CaveOverlay Initialization was successfull.");
}
void ACAVEOverlayController::UpdatePossessedPawn(APawn* OldPawn, APawn* NewPawn)
{
InitFromPawn(NewPawn);
}
void ACAVEOverlayController::InitFromPawn(const APawn* CurrentPawn)
{
// Clear previous properties. We could reuse the SMCs and MIDs, clearing them might be dangerous.
// Too much in a hurry here to make this better.
MotionControllers.Empty();
SignsStaticMeshComponents.Empty();
SignsMIDs.Empty();
// Get the pawn so we can have access to head and hand positions
if (const auto* VRPawn = Cast<APawn>(PC->GetPawnOrSpectator()))
if (CurrentPawn)
{
PawnCamera = VRPawn->GetComponentByClass<UCameraComponent>();
auto FoundMotionControllers = VRPawn->K2_GetComponentsByClass(UMotionControllerComponent::StaticClass());
PawnCamera = CurrentPawn->GetComponentByClass<UCameraComponent>();
auto FoundMotionControllers = CurrentPawn->K2_GetComponentsByClass(UMotionControllerComponent::StaticClass());
for (const auto FoundMotionController : FoundMotionControllers)
{
@@ -261,13 +290,9 @@ void ACAVEOverlayController::BeginPlay()
}
else
{
bInitialized = false;
UE_LOGFMT(LogCAVEOverlay, Error, "No VirtualRealityPawn found which we could attach to!");
}
// Create dynamic material for tape
TapeMaterialDynamic = Tape->CreateDynamicMaterialInstance(0);
UE_LOGFMT(LogCAVEOverlay, Display, "CaveOverlay Initialization was successfull.");
}
void ACAVEOverlayController::EndPlay(const EEndPlayReason::Type EndPlayReason)
@@ -386,6 +411,12 @@ void ACAVEOverlayController::Tick(float DeltaTime)
// Hand Logic
for (int i = 0; i < MotionControllers.Num(); i++)
{
if (MotionControllers[i] == nullptr)
{
UE_LOGFMT(LogCAVEOverlay, Error, "Motion Controller was nullptr, disabling overlay!");
bInitialized = false;
return;
}
const FVector HandPosition = MotionControllers[i]->GetRelativeLocation();
// Set the position rotation, opacity, visibility of the hand warning signs.
Loading