Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 4.21
  • 4.22
  • 4.26
  • 4.27
  • 5.0
  • 5.3
  • 5.4
  • 5.5
  • IntenSelect5.3
  • _IntenSelect5.3
  • dev/5.3_downgrade
  • dev/5.4
  • dev/5.5
  • feature/experimenttime_hack
  • UE5.3-2023.1-rc
  • UE5.3-2023.1-rc2
  • UE5.3-2023.1-rc3
  • UE5.4-2024.1
  • UE5.4-2024.1-rc1
19 results

Target

Select target project
  • vr-vis/VR-Group/unreal-development/plugins/rwth-vr-toolkit
  • daniel.rupp/rwth-vr-toolkit
2 results
Select Git revision
  • 4.21
  • 4.22
  • 4.26
  • 4.27
  • 5.0
  • 5.3
  • ReworkedToolkit
  • TempNav
  • dev/5.1
  • dev/5.2
  • dev/5.3
  • feature/make_interaction_ray_accesible
  • feature/scaleAndHeightTeleport
  • feature/scaleTeleport
  • fix/DisplayClusterTemplateCode
  • fix_5.3/DisplayClusterTemplateFix
16 results
Show changes
Showing
with 201 additions and 1075 deletions
......@@ -15,15 +15,6 @@
"Installed": false,
"EnabledByDefault": true,
"Modules": [
{
"Name": "RWTHVRCluster",
"Type": "Runtime",
"LoadingPhase": "Default",
"WhitelistPlatforms": [
"Win64",
"Linux"
]
},
{
"Name": "RWTHVRToolkit",
"Type": "Runtime",
......@@ -36,23 +27,10 @@
}
],
"Plugins": [
{
"Name": "nDisplay",
"Enabled": true
},
{
"Name": "LiveLink",
"Enabled": true
},
{
"Name": "LiveLinkOvernDisplay",
"Enabled": true
},
{
"Name": "DTrackPlugin",
"Enabled": true,
"Optional": true
},
{
"Name": "EnhancedInput",
"Enabled": true
......@@ -62,9 +40,8 @@
"Enabled": true
},
{
"Name": "Switchboard",
"Enabled": true,
"Optional": true
"Name": "XRBase",
"Enabled": true
}
]
}
// Fill out your copyright notice in the Description page of Project Settings.
#include "CaveSetup.h"
#include "Logging/StructuredLog.h"
#include "Utility/RWTHVRUtilities.h"
// Sets default values
ACaveSetup::ACaveSetup()
{
PrimaryActorTick.bCanEverTick = false;
SetActorEnableCollision(false);
// Actor needs to replicate, as it is attached to the pawn on the server.
bReplicates = true;
}
// Called when the game starts or when spawned
void ACaveSetup::BeginPlay()
{
Super::BeginPlay();
if (!URWTHVRUtilities::IsRoomMountedMode())
{
return;
}
// Spawn all actors that are set in the blueprint asset.
for (const auto ActorClass : ActorsToSpawnOnCave)
{
if (const auto World = GetWorld())
{
const auto Actor = World->SpawnActor(ActorClass);
Actor->AttachToActor(this, FAttachmentTransformRules::SnapToTargetNotIncludingScale);
UE_LOGFMT(LogTemp, Display, "CaveSetup: Spawned Actor {Actor} on the Cave and attached it.",
Actor->GetName());
}
}
// Apply the DTrack LiveLink Preset. Only do this if we are the primaryNode
if (URWTHVRUtilities::IsPrimaryNode())
{
if (LiveLinkPresetToApplyOnCave && LiveLinkPresetToApplyOnCave->IsValidLowLevelFast())
{
LiveLinkPresetToApplyOnCave->ApplyToClientLatent();
UE_LOGFMT(LogTemp, Display, "CaveSetup: Applied LiveLinkPreset {Preset} to Client.",
LiveLinkPresetToApplyOnCave->GetName());
}
}
}
#include "ClusterConsole/ClusterConsole.h"
#include "IDisplayCluster.h"
#include "Cluster/DisplayClusterClusterEvent.h"
void FClusterConsole::Register()
{
/* Registering console command */
ClusterConsoleCommand = IConsoleManager::Get().RegisterConsoleCommand(
TEXT("ClusterExecute"),
TEXT("<Your Command> - Execute commands on every node of the nDisplay cluster by prepending ClusterExecute"),
FConsoleCommandWithArgsDelegate::CreateLambda(
[](const TArray<FString>& Args)
{
if (IDisplayCluster::Get().GetClusterMgr() == nullptr || Args.Num() == 0)
return;
/* Emitting cluster event */
FDisplayClusterClusterEventJson ClusterEvent;
ClusterEvent.Name = "ClusterExecute " + Args[0];
ClusterEvent.Type = Args[0];
ClusterEvent.Category = "NDisplayClusterExecute";
ClusterEvent.Parameters.Add("Command", FString::Join(Args, TEXT(" ")));
IDisplayCluster::Get().GetClusterMgr()->EmitClusterEventJson(ClusterEvent, false);
}));
/* Register cluster event handling */
const IDisplayCluster* DisplayCluster = FModuleManager::LoadModulePtr<IDisplayCluster>(IDisplayCluster::ModuleName);
if (DisplayCluster && !ClusterEventListenerDelegate.IsBound())
{
ClusterEventListenerDelegate = FOnClusterEventJsonListener::CreateLambda(
[](const FDisplayClusterClusterEventJson& Event)
{
/* Actual handling */
if (Event.Category.Equals("NDisplayClusterExecute") && Event.Parameters.Contains("Command") && GEngine)
{
GEngine->Exec(GEngine->GetCurrentPlayWorld(), *Event.Parameters["Command"]);
}
});
DisplayCluster->GetClusterMgr()->AddClusterEventJsonListener(ClusterEventListenerDelegate);
}
}
void FClusterConsole::Unregister() const
{
IConsoleManager::Get().UnregisterConsoleObject(ClusterConsoleCommand);
IDisplayCluster::Get().GetClusterMgr()->RemoveClusterEventJsonListener(ClusterEventListenerDelegate);
}
#include "RWTHVRCluster.h"
#define LOCTEXT_NAMESPACE "FRWTHVRClusterModule"
void FRWTHVRClusterModule::StartupModule() { ClusterConsole.Register(); }
void FRWTHVRClusterModule::ShutdownModule() { ClusterConsole.Unregister(); }
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FRWTHVRClusterModule, RWTHVRCluster)
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CAVEOverlay/DoorOverlayData.h"
#include "Cluster/IDisplayClusterClusterManager.h"
#include "Pawn/RWTHVRPawn.h"
#include "CAVEOverlayController.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogCAVEOverlay, Log, All);
/**
* Actor which controls the cave overlay. The overlay displays a warning tape around the cave
* when the user moves their head too close to the wall, and a warning sign when the hands are
* too close.
*/
UCLASS()
class RWTHVRCLUSTER_API ACAVEOverlayController : public AActor
{
GENERATED_BODY()
public:
ACAVEOverlayController();
protected:
virtual void BeginPlay() override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
private:
// Types of cave screens defined in the cluster config.
enum EScreen_Type
{
// the primary node screen
SCREEN_PRIMARY,
// any secondary node screen
SCREEN_NORMAL,
// the screens that cover the partially opened door
SCREEN_DOOR_PARTIAL,
// additional screens that cover the door
SCREEN_DOOR
};
// which screen type this node is running on
EScreen_Type ScreenType = SCREEN_NORMAL;
// which additional node names define the screens that cover the door
const TArray<FString> ScreensDoor = {"node_bul_left_eye", "node_bul_right_eye", "node_bll_left_eye",
"node_bll_right_eye"};
// which node names define the screens that cover the partial door
const TArray<FString> ScreensDoorPartial = {"node_bur_left_eye", "node_bur_right_eye", "node_blr_left_eye",
"node_blr_right_eye"};
const FString ScreenMain = "node_main";
// Door Mode
enum EDoorMode
{
DOOR_PARTIALLY_OPEN = 0,
DOOR_OPEN = 1,
DOOR_CLOSED = 2,
DOOR_DEBUG = 3,
DOOR_NUM_MODES = 4
};
const FString DoorModeNames[DOOR_NUM_MODES] = {"Partially Open", "Open", "Closed", "Debug"};
EDoorMode DoorCurrentMode = DOOR_PARTIALLY_OPEN;
const float DoorOpeningWidthRelative = 0.522; //%, used for the overlay width on the screen
const float DoorOpeningWidthAbsolute = 165; // cm, used for the non tape part at the door
const float WallDistance = 262.5; // cm, distance from center to a wall, *2 = wall width
const float WallCloseDistance = 75; // cm, the distance considered to be too close to the walls
const float WallFadeDistance = 35; // cm, the distance over which the tape is faded
const float WallWarningDistance = 40; // cm, distance on which the tape turns red, measured from wall
float DoorCurrentOpeningWidthAbsolute = 0;
// Helper function to create a mesh component in the constructor
UStaticMeshComponent* CreateMeshComponent(const FName& Name, USceneComponent* Parent);
// Calculates opacity value used for the dynamic materials of the tape and sign. The closer the more opaque.
double CalculateOpacityFromPosition(const FVector& Position) const;
// Check whether the given position is within the door area of the (partially) open door.
bool PositionInDoorOpening(const FVector& Position) const;
// Sets the position, orientation and opacity/visibility of the Sign according to the HandPosition.
void SetSignsForHand(UStaticMeshComponent* Sign, const FVector& HandPosition,
UMaterialInstanceDynamic* HandMaterial) const;
// Only calculate positions and material values when we're fully initialized.
bool bInitialized = false;
// Reference to the currently active pawn that we're tracking positions of.
UPROPERTY()
ARWTHVRPawn* VRPawn;
// Cluster Events
FOnClusterEventJsonListener ClusterEventListenerDelegate;
void HandleClusterEvent(const FDisplayClusterClusterEventJson& Event);
public:
virtual void Tick(float DeltaTime) override;
// Change door mode manually between open, partially open and closed.
void CycleDoorType();
void SetDoorMode(EDoorMode M);
// Root component
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "CAVEOverlay", meta = (AllowPrivateAccess = "true"))
USceneComponent* Root;
// Tape Static Mesh component. Reference to static mesh needs to be set in the corresponding BP.
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "CAVEOverlay", meta = (AllowPrivateAccess = "true"))
UStaticMeshComponent* Tape;
// Right Hand Sign Static Mesh component. Reference to static mesh needs to be set in the corresponding BP.
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "CAVEOverlay", meta = (AllowPrivateAccess = "true"))
UStaticMeshComponent* SignRightHand;
// Left Hand Sign Static Mesh component. Reference to static mesh needs to be set in the corresponding BP.
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "CAVEOverlay", meta = (AllowPrivateAccess = "true"))
UStaticMeshComponent* SignLeftHand;
// UI Overlay
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "CAVEOverlay")
TSubclassOf<UDoorOverlayData> OverlayClass;
// UI Overlay
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "CAVEOverlay")
UInputAction* CycleDoorTypeInputAction;
UPROPERTY()
UDoorOverlayData* Overlay;
// Dynamic Materials to control opacity
UPROPERTY()
UMaterialInstanceDynamic* TapeMaterialDynamic;
UPROPERTY()
UMaterialInstanceDynamic* RightSignMaterialDynamic;
UPROPERTY()
UMaterialInstanceDynamic* LeftSignMaterialDynamic;
};
#pragma once
#include "CoreMinimal.h"
#include "Engine/DeveloperSettings.h"
#include "CAVEOverlaySettings.generated.h"
UENUM(BlueprintType)
enum DefaultActivationType
{
DefaultActivationType_OFF UMETA(DisplayName = "Off by default"),
DefaultActivationType_ON UMETA(DisplayName = "On by default")
};
UCLASS(config = Game, defaultconfig, meta = (DisplayName = "CAVE Overlay"))
class RWTHVRCLUSTER_API UCAVEOverlaySettings : public UDeveloperSettings
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, config, Category = "General", meta = (DisplayName = "Default Activation Type"))
TEnumAsByte<DefaultActivationType> DefaultActivationType = DefaultActivationType_ON;
UPROPERTY(EditAnywhere, config, Category = Maps, meta = (AllowedClasses = "/Script/Engine.World"))
TArray<FSoftObjectPath> ExcludedMaps;
};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// Fill out your copyright notice in the Description page of Project Settings.
#include "Interaction/Interactables/BaseBehaviour.h"