diff --git a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp index 6e2b756f70c07128b52cc46dae52c216da0ebb32..9301e07ffeda2d5434853a42fdf52fd8c9c5d2f6 100644 --- a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp +++ b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp @@ -111,6 +111,22 @@ ACAVEOverlayController::ACAVEOverlayController() Sign_Positive_Y->SetRelativeScale3D(FVector(0.5f)); Sign_Negative_X->SetRelativeScale3D(FVector(0.5f)); Sign_Positive_X->SetRelativeScale3D(FVector(0.5f)); + + IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr(); + if (ClusterManager && !ClusterEventListenerDelegate.IsBound()) + { + ClusterEventListenerDelegate = FOnClusterEventListener::CreateUObject(this, &ACAVEOverlayController::HandleClusterEvent); + ClusterManager->AddClusterEventListener(ClusterEventListenerDelegate); + } +} + +ACAVEOverlayController::~ACAVEOverlayController() +{ + IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr(); + if (ClusterManager && ClusterEventListenerDelegate.IsBound()) + { + ClusterManager->RemoveClusterEventListener(ClusterEventListenerDelegate); + } } void ACAVEOverlayController::PostInitializeComponents() @@ -135,7 +151,25 @@ void ACAVEOverlayController::PostInitializeComponents() void ACAVEOverlayController::CycleDoorType() { Door_Current_Mode = static_cast<EDoor_Mode>((Door_Current_Mode + 1) % DOOR_NUM_MODES); - SetDoorMode(Door_Current_Mode); + + IDisplayClusterClusterManager* const Manager = IDisplayCluster::Get().GetClusterMgr(); + if (Manager) + { + FDisplayClusterClusterEvent cluster_event; + cluster_event.Name = "CAVEOverlay Change Door to " + Door_Mode_Names[Door_Current_Mode]; + cluster_event.Type = "DoorChange"; + cluster_event.Category = "CAVEOverlay"; + cluster_event.Parameters.Add("NewDoorState", FString::FromInt(Door_Current_Mode)); + Manager->EmitClusterEvent(cluster_event, true); + } +} + +void ACAVEOverlayController::HandleClusterEvent(const FDisplayClusterClusterEvent& Event) +{ + if (Event.Category.Equals("CAVEOverlay") && Event.Type.Equals("DoorChange") && Event.Parameters.Contains("NewDoorState")) + { + SetDoorMode(static_cast<EDoor_Mode>(FCString::Atoi(*Event.Parameters["NewDoorState"]))); + } } void ACAVEOverlayController::SetDoorMode(EDoor_Mode M) @@ -182,15 +216,15 @@ void ACAVEOverlayController::BeginPlay() Super::BeginPlay(); //Read situation - if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster) { + if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster) + { auto ClusterConfigCustom = IDisplayCluster::Get().GetConfigMgr()->GetConfigCustom(); bCAVE_Mode = ClusterConfigCustom.Args.Contains("Hardware_Platform") && ClusterConfigCustom.Args.Find("Hardware_Platform")->Equals("aixcave", ESearchCase::IgnoreCase); } - + if (!bCAVE_Mode) return; // Not our business //Input config - InputComponent->BindAction("Action4", EInputEvent::IE_Pressed, this, &ACAVEOverlayController::CycleDoorType); InputComponent->BindKey(EKeys::F10, EInputEvent::IE_Pressed, this, &ACAVEOverlayController::CycleDoorType); //Determine the screen-type for later usage @@ -242,13 +276,8 @@ bool ACAVEOverlayController::PositionInDoorOpening(FVector Position) void ACAVEOverlayController::RefreshPawnComponents() { - TArray<UDisplayClusterSceneComponent*> Pawn_Components; - Player_Pawn->GetComponents<UDisplayClusterSceneComponent>(Pawn_Components); - for (UDisplayClusterSceneComponent* c : Pawn_Components) - { - if (c->GetName().Equals("cave_origin", ESearchCase::IgnoreCase)) Cave_Origin = c; - if (c->GetName().Equals("shutter_glasses", ESearchCase::IgnoreCase)) Shutter_Glasses = c; - } + Cave_Origin = Player_Pawn->GetCaveOriginComponent(); + Shutter_Glasses = Player_Pawn->GetShutterGlassesComponent(); } // Called every frame @@ -258,7 +287,11 @@ void ACAVEOverlayController::Tick(float DeltaTime) if (!bCAVE_Mode) return; // Not our business - RefreshPawnComponents(); + if (!Cave_Origin || !Shutter_Glasses) + { + RefreshPawnComponents(); + } + if (!bAttached && Cave_Origin) { AttachToComponent(Cave_Origin, FAttachmentTransformRules::SnapToTargetNotIncludingScale); @@ -266,7 +299,8 @@ void ACAVEOverlayController::Tick(float DeltaTime) } //FPS Counter - if (Overlay) { + if (Overlay) + { if (Door_Current_Mode == EDoor_Mode::DOOR_DEBUG && ContainsFString(Screens_FPS, IDisplayCluster::Get().GetClusterMgr()->GetNodeId())) { Overlay->FPS->SetText(FText::FromString(FString::Printf(TEXT("FPS: %.1f"), 1.0f / DeltaTime))); @@ -276,7 +310,7 @@ void ACAVEOverlayController::Tick(float DeltaTime) Overlay->FPS->SetText(FText::FromString("")); } } - + if (!Shutter_Glasses) return; //Display Cluster not initialized //Tape Logic diff --git a/Source/CAVEOverlay/Public/CAVEOverlayController.h b/Source/CAVEOverlay/Public/CAVEOverlayController.h index 9ea5ba1b1645b75c1924d40b3e2a884ada0e458c..6daa7e9183abe3cb111e0d9c78f9b9218e9f8651 100644 --- a/Source/CAVEOverlay/Public/CAVEOverlayController.h +++ b/Source/CAVEOverlay/Public/CAVEOverlayController.h @@ -12,6 +12,8 @@ #include "Materials/MaterialInstanceDynamic.h" #include "DisplayClusterExtensions/Public/VirtualRealityPawn.h" #include "DisplayCluster/Public/DisplayClusterSceneComponent.h" +#include "Cluster/DisplayClusterClusterEvent.h" +#include "Cluster/IDisplayClusterClusterManager.h" #include "CAVEOverlayController.generated.h" DECLARE_LOG_CATEGORY_EXTERN(LogCAVEOverlay, Log, All); @@ -22,6 +24,7 @@ class CAVEOVERLAY_API ACAVEOverlayController : public AActor GENERATED_BODY() public: ACAVEOverlayController(); + ~ACAVEOverlayController(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; @@ -68,8 +71,12 @@ private: bool bAttached = false; void RefreshPawnComponents(); AVirtualRealityPawn* Player_Pawn; - UDisplayClusterSceneComponent* Cave_Origin; - UDisplayClusterSceneComponent* Shutter_Glasses; + USceneComponent* Cave_Origin; + USceneComponent* Shutter_Glasses; + + //Cluster Events + FOnClusterEventListener ClusterEventListenerDelegate; + void HandleClusterEvent(const FDisplayClusterClusterEvent& Event); public: