Skip to content
Snippets Groups Projects
Commit 90cdcfe7 authored by Ali Can Demiralp's avatar Ali Can Demiralp
Browse files

Merge branch 'develop'

parents 05538d27 80c81f22
Branches
No related tags found
No related merge requests found
Showing
with 832 additions and 248 deletions
#####################################################################
# nDisplay config file
#
# This file demonstrates how to configure for the AixCAVE.
#####################################################################
#####################################################################
# List of cluster nodes
#********************************************************************
# Cluster node is an application instance. It's allowed to use
# multiple instances on the same PC. Sometimes its necessary.
#
# Properties:
# id - unique node name
# addr - network address (IPv4 only)
# screen - projection screen ID to use
# viewport - viewport ID to use
# master - specifies if current node is master; default is 'false'
# port_cs - Cluster Synchronization port (required on master node only)
# port_ss - Swap Synchronization port (required on master node only)
#
# Optional properties:
# sound - turns on/off sound for this application instance; default is 'false'
#********************************************************************
[cluster_node] id=node_main addr=10.0.1.29 screen=screen_main viewport=vp_1000 port_cs=41001 port_ss=41002 master=true sound=true
[cluster_node] id=node_front_upper_left_eye_left addr=10.0.1.1 screen=screen_front_upper_left viewport=vp_1200
[cluster_node] id=node_front_upper_left_eye_right addr=10.0.1.1 screen=screen_front_upper_left viewport=vp_1200
[cluster_node] id=node_front_upper_right_eye_left addr=10.0.1.2 screen=screen_front_upper_right viewport=vp_1200
[cluster_node] id=node_front_upper_right_eye_right addr=10.0.1.2 screen=screen_front_upper_right viewport=vp_1200
[cluster_node] id=node_front_lower_left_eye_left addr=10.0.1.3 screen=screen_front_lower_left viewport=vp_1200
[cluster_node] id=node_front_lower_left_eye_right addr=10.0.1.3 screen=screen_front_lower_left viewport=vp_1200
[cluster_node] id=node_front_lower_right_eye_left addr=10.0.1.4 screen=screen_front_lower_left viewport=vp_1200
[cluster_node] id=node_front_lower_right_eye_right addr=10.0.1.4 screen=screen_front_lower_left viewport=vp_1200
[cluster_node] id=node_left_upper_left_eye_left addr=10.0.1.5 screen=screen_left_upper_left viewport=vp_1200
[cluster_node] id=node_left_upper_left_eye_right addr=10.0.1.5 screen=screen_left_upper_left viewport=vp_1200
[cluster_node] id=node_left_upper_right_eye_left addr=10.0.1.6 screen=screen_left_upper_right viewport=vp_1200
[cluster_node] id=node_left_upper_right_eye_right addr=10.0.1.6 screen=screen_left_upper_right viewport=vp_1200
[cluster_node] id=node_left_lower_left_eye_left addr=10.0.1.7 screen=screen_left_lower_left viewport=vp_1200
[cluster_node] id=node_left_lower_left_eye_right addr=10.0.1.7 screen=screen_left_lower_left viewport=vp_1200
[cluster_node] id=node_left_lower_right_eye_left addr=10.0.1.8 screen=screen_left_lower_right viewport=vp_1200
[cluster_node] id=node_left_lower_right_eye_right addr=10.0.1.8 screen=screen_left_lower_right viewport=vp_1200
[cluster_node] id=node_right_upper_left_eye_left addr=10.0.1.9 screen=screen_right_upper_left viewport=vp_1200
[cluster_node] id=node_right_upper_left_eye_right addr=10.0.1.9 screen=screen_right_upper_left viewport=vp_1200
[cluster_node] id=node_right_upper_right_eye_left addr=10.0.1.10 screen=screen_right_upper_right viewport=vp_1200
[cluster_node] id=node_right_upper_right_eye_right addr=10.0.1.10 screen=screen_right_upper_right viewport=vp_1200
[cluster_node] id=node_right_lower_left_eye_left addr=10.0.1.11 screen=screen_right_lower_left viewport=vp_1200
[cluster_node] id=node_right_lower_left_eye_right addr=10.0.1.11 screen=screen_right_lower_left viewport=vp_1200
[cluster_node] id=node_right_lower_right_eye_left addr=10.0.1.12 screen=screen_right_lower_right viewport=vp_1200
[cluster_node] id=node_right_lower_right_eye_right addr=10.0.1.12 screen=screen_right_lower_right viewport=vp_1200
[cluster_node] id=node_back_upper_left_eye_left addr=10.0.1.13 screen=screen_back_upper_left viewport=vp_1200
[cluster_node] id=node_back_upper_left_eye_right addr=10.0.1.13 screen=screen_back_upper_left viewport=vp_1200
[cluster_node] id=node_back_upper_right_eye_left addr=10.0.1.14 screen=screen_back_upper_right viewport=vp_1200
[cluster_node] id=node_back_upper_right_eye_right addr=10.0.1.14 screen=screen_back_upper_right viewport=vp_1200
[cluster_node] id=node_back_lower_left_eye_left addr=10.0.1.15 screen=screen_back_lower_left viewport=vp_1200
[cluster_node] id=node_back_lower_left_eye_right addr=10.0.1.15 screen=screen_back_lower_left viewport=vp_1200
[cluster_node] id=node_back_lower_right_eye_left addr=10.0.1.16 screen=screen_back_lower_right viewport=vp_1200
[cluster_node] id=node_back_lower_right_eye_right addr=10.0.1.16 screen=screen_back_lower_right viewport=vp_1200
[cluster_node] id=node_floor_front_upper_left_eye_left addr=10.0.1.17 screen=screen_floor_front_upper_left viewport=vp_1200
[cluster_node] id=node_floor_front_upper_left_eye_right addr=10.0.1.17 screen=screen_floor_front_upper_left viewport=vp_1200
[cluster_node] id=node_floor_front_upper_right_eye_left addr=10.0.1.19 screen=screen_floor_front_upper_right viewport=vp_1200
[cluster_node] id=node_floor_front_upper_right_eye_right addr=10.0.1.19 screen=screen_floor_front_upper_right viewport=vp_1200
[cluster_node] id=node_floor_front_lower_left_eye_left addr=10.0.1.18 screen=screen_floor_front_lower_left viewport=vp_1200
[cluster_node] id=node_floor_front_lower_left_eye_right addr=10.0.1.18 screen=screen_floor_front_lower_left viewport=vp_1200
[cluster_node] id=node_floor_front_lower_right_eye_left addr=10.0.1.20 screen=screen_floor_front_lower_right viewport=vp_1200
[cluster_node] id=node_floor_front_lower_right_eye_right addr=10.0.1.20 screen=screen_floor_front_lower_right viewport=vp_1200
[cluster_node] id=node_floor_back_upper_left_eye_left addr=10.0.1.21 screen=screen_floor_back_upper_left viewport=vp_1200
[cluster_node] id=node_floor_back_upper_left_eye_right addr=10.0.1.21 screen=screen_floor_back_upper_left viewport=vp_1200
[cluster_node] id=node_floor_back_upper_right_eye_left addr=10.0.1.23 screen=screen_floor_back_upper_right viewport=vp_1200
[cluster_node] id=node_floor_back_upper_right_eye_right addr=10.0.1.23 screen=screen_floor_back_upper_right viewport=vp_1200
[cluster_node] id=node_floor_back_lower_left_eye_left addr=10.0.1.22 screen=screen_floor_back_lower_left viewport=vp_1200
[cluster_node] id=node_floor_back_lower_left_eye_right addr=10.0.1.22 screen=screen_floor_back_lower_left viewport=vp_1200
[cluster_node] id=node_floor_back_lower_right_eye_left addr=10.0.1.24 screen=screen_floor_back_lower_right viewport=vp_1200
[cluster_node] id=node_floor_back_lower_right_eye_right addr=10.0.1.24 screen=screen_floor_back_lower_right viewport=vp_1200
#####################################################################
#####################################################################
# List of projection screens
#********************************************************************
# Projection screen is a rectangle which determines the camera frustum.
# Usually the projection screen has the same dimensions as an output
# display but in some cases it may differ.
#
# Properties:
# id - unique projection screen name
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified. The pivot is a screen's
# center and the values are in meters.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified. The pivot is a screen's
# center and the values are in degrees.
# size - width (X) and height (Y) of the screen. Values are in meters.
#
# Optional properties:
# parent - ID of parent component in VR hierarchy; default is VR root.
# tracker_id - ID of tracking device; no tracking by default.
# tracker_ch - ID of tracking device's channel; no tracking by default.
#********************************************************************
[screen] id=screen_main loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=0.433333,Y=0.270833" parent=display_main
[screen] id=screen_front_upper_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_front_upper_left
[screen] id=screen_front_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_front_upper_right
[screen] id=screen_front_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_front_lower_left
[screen] id=screen_front_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_front_lower_left
[screen] id=screen_left_upper_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_left_upper_left
[screen] id=screen_left_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_left_upper_right
[screen] id=screen_left_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_left_lower_left
[screen] id=screen_left_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_left_lower_right
[screen] id=screen_right_upper_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_right_upper_left
[screen] id=screen_right_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_right_upper_right
[screen] id=screen_right_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_right_lower_left
[screen] id=screen_right_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_right_lower_right
[screen] id=screen_back_upper_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_back_upper_left
[screen] id=screen_back_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_back_upper_right
[screen] id=screen_back_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_back_lower_left
[screen] id=screen_back_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.14285,Y=1.964285" parent=display_back_lower_right
[screen] id=screen_floor_front_upper_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_front_upper_left
[screen] id=screen_floor_front_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_front_upper_right
[screen] id=screen_floor_front_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_front_lower_left
[screen] id=screen_floor_front_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_front_lower_right
[screen] id=screen_floor_back_upper_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_back_upper_left
[screen] id=screen_floor_back_upper_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_back_upper_right
[screen] id=screen_floor_back_lower_left loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_back_lower_left
[screen] id=screen_floor_back_lower_right loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=1.875" parent=display_floor_back_lower_right
###############################################################
#####################################################################
# List of viewport configurations
#********************************************************************
# Viewport is a rectangle area of game window where rendered frame is
# mapped. Usually the viewport starts at 0:0 and has the same size as
# its parent window but in some cases these settings may differ.
#
# Properties:
# id - unique viewport name
# x - X coordinate of viewport's top left corner
# y - Y coordinate of viewport's top left corner
# width - width of viewport in pixels
# height - height of viewport in pixels
#
# Optional properties:
# flip_h - flip image horizontally; default is 'false'
# flip_v - flip image vertically; default is 'false'
#********************************************************************
[viewport] id=vp_1000 x=0 y=0 width=1600 height=1000 flip_h=False flip_v=False
[viewport] id=vp_1200 x=0 y=0 width=1920 height=1200 flip_h=False flip_v=False
#####################################################################
#####################################################################
# List of cameras
#********************************************************************
# Camera is a predefined point frome where the stereoscopic view built.
# It's possible to define multiple cameras and swith the active one
# during runtime. You're free to attach any camera to a tracking device
# for head tracking. Consider a camera as a viewer's head.
#
# Properties:
# id - unique camera name
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified.
#
# Optional properties:
# parent - ID of parent component in VR hierarchy; default is VR root.
# tracker_id - ID of tracking device; no tracking by default.
# tracker_ch - ID of tracking device's channel; no tracking by default.
#********************************************************************
[camera] id=camera_dynamic loc="X=0,Y=0,Z=0" parent=shutter_glasses
#####################################################################
#####################################################################
# List of scene nodes nodes (hierarchy transforms)
#********************************************************************
# Scene node is an actor component which is basically a transformation
# matrix. Scene nodes can be helpful to build a component hierarchy, to
# define some special places (like a socket) within VR space.
#
# It might be difficult to understand what VR space origin is. Consider
# it as a point in space where VR space starts. Any componenent listed
# in this config file is relative to its parent or this origin.
#
# Properties:
# id - unique scene node name
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified.
#
# Optional properties:
# parent - ID of parent component in VR hierarchy; default is VR root.
# tracker_id - ID of tracking device; no tracking by default.
# tracker_ch - ID of tracking device's channel; no tracking by default.
#********************************************************************
[scene_node] id=cave_origin loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0"
[scene_node] id=cave_center loc="X=0,Y=0,Z=1.65" rot="P=0,Y=0,R=0" parent=cave_origin
[scene_node] id=flystick loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" parent=cave_origin tracker_id=dtrack_tracker tracker_ch=7
[scene_node] id=shutter_glasses loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" parent=cave_origin tracker_id=dtrack_tracker tracker_ch=0
[scene_node] id=display_main loc="X=0.40.0,Y=0,Z=0" rot="P=0,Y=0,R=0" parent=shutter_glasses
[scene_node] id=angle_left loc="X=0,Y=0,Z=0" rot="P=0,Y=-90,R=0" parent=cave_center
[scene_node] id=angle_right loc="X=0,Y=0,Z=0" rot="P=0,Y=90,R=0" parent=cave_center
[scene_node] id=angle_back loc="X=0,Y=0,Z=0" rot="P=0,Y=180,R=0" parent=cave_center
[scene_node] id=angle_floor loc="X=0,Y=0,Z=0" rot="P=-90,Y=0,R=0" parent=cave_origin
[scene_node] id=display_front_upper_left loc="X=2.625,Y=-1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=cave_center
[scene_node] id=display_front_upper_right loc="X=2.625,Y=+1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=cave_center
[scene_node] id=display_front_lower_left loc="X=2.625,Y=-1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=cave_center
[scene_node] id=display_front_lower_left loc="X=2.625,Y=+1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=cave_center
[scene_node] id=display_left_upper_left loc="X=2.625,Y=-1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=angle_left
[scene_node] id=display_left_upper_right loc="X=2.625,Y=+1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=angle_left
[scene_node] id=display_left_lower_left loc="X=2.625,Y=-1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=angle_left
[scene_node] id=display_left_lower_right loc="X=2.625,Y=+1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=angle_left
[scene_node] id=display_right_upper_left loc="X=2.625,Y=-1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=angle_right
[scene_node] id=display_right_upper_right loc="X=2.625,Y=+1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=angle_right
[scene_node] id=display_right_lower_left loc="X=2.625,Y=-1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=angle_right
[scene_node] id=display_right_lower_right loc="X=2.625,Y=+1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=angle_right
[scene_node] id=display_back_upper_left loc="X=2.625,Y=-1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=angle_back
[scene_node] id=display_back_upper_right loc="X=2.625,Y=+1.053575,Z=+0.6678575" rot="P=0,Y=0,R=0" parent=angle_back
[scene_node] id=display_back_lower_left loc="X=2.625,Y=-1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=angle_back
[scene_node] id=display_back_lower_right loc="X=2.625,Y=+1.053575,Z=-0.6678575" rot="P=0,Y=0,R=0" parent=angle_back
[scene_node] id=display_floor_front_upper_left loc="X=0,Y=-1.125,Z=+1.6875" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_front_upper_right loc="X=0,Y=1.125,Z=+1.6875" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_front_lower_left loc="X=0,Y=-1.125,Z=+0.9375" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_front_lower_right loc="X=0,Y=1.125,Z=+0.9375" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_back_upper_left loc="X=0,Y=-1.125,Z=-0.9375" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_back_upper_right loc="X=0,Y=1.125,Z=-0.9375" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_back_lower_left loc="X=0,Y=-1.125,Z=-1.6875" rot="P=0,Y=0,R=0" parent=angle_floor
[scene_node] id=display_floor_back_lower_right loc="X=0,Y=1.125,Z=-1.6875" rot="P=0,Y=0,R=0" parent=angle_floor
#####################################################################
#####################################################################
# List of input devices
#********************************************************************
# Input devices are VRPN devices. The nDisplay supports the following
# types: analog, button and tracker. Many of physical input devices
# can be connected via VRPN.
#
# Properties:
# id - nique device name
# type - VRPN type (analog, button or tracker).
# addr - address of a VRPN server which handles this particular device.
# The value must match the following format: DEVICENAME@SERVER_ADDRESS
# where DEVICENAME is a VRPN name of this device and SERVER_ADDRESS
# is IPv4 address of VRPN server.
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified.
#
# front (tracker only) - mapping of a tracking system axis to X axis of VR origin
# right (tracker only) - mapping of a tracking system axis to Y axis of VR origin
# up (tracker only) - mapping of a tracking system axis to Z axis of VR origin
# * The following values are allowed for axes mapping: X, -X, Y, -Y, Z, -Z
#
# Optional properties:
# remap - VRPN device channel remapping. Value format is: "from0:to0,from1:to1,...,fromN:toN".
# For example: remap="0:3,1:4,5:2"
#********************************************************************
[input] id=dtrack_axis type=analog addr=DTrack2@10.0.1.29
[input] id=dtrack_buttons type=buttons addr=DTrack2@10.0.1.29
[input] id=dtrack_tracker type=tracker addr=DTrack2@10.0.1.29 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" right=X up=Y front=-Z
#####################################################################
#####################################################################
# Stereoscopic settings
#********************************************************************
# Properties:
# eye_swap - swap left and right eyes:
# false - L|R
# true - R|L
# eye_dist - interoccular distance in meters
[stereo] eye_swap=True eye_dist=0.064
#####################################################################
#####################################################################
# General settings
#********************************************************************
# Properties:
# swap_sync_policy - swap synchronization policy
# - 0 - no synchronization
# - 1 - software swap synchronization
# - 2 - NV swap lock (Nvidia cards only, OpenGL only)
[general] swap_sync_policy=2
#####################################################################
#####################################################################
# Custom arguments
#********************************************************************
# Any custom arguments available in runtime can be specified here.
# Format: ARG_NAME=ARG_VAL
[custom]
#####################################################################
This diff is collapsed.
using UnrealBuildTool;
public class nDisplayExtensions : ModuleRules
public class DisplayClusterExtensions : ModuleRules
{
public nDisplayExtensions(ReadOnlyTargetRules Target) : base(Target)
public DisplayClusterExtensions(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
......@@ -28,6 +28,7 @@ public class nDisplayExtensions : ModuleRules
"Core",
"CoreUObject",
"DisplayCluster",
"DisplayClusterInput",
"Engine",
"InputCore"
}
......
#include "DisplayClusterExtensions.h"
#define LOCTEXT_NAMESPACE "FnDisplayExtensionsModule"
void FDisplayClusterExtensionsModule::StartupModule ()
{
}
void FDisplayClusterExtensionsModule::ShutdownModule()
{
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FDisplayClusterExtensionsModule, DisplayClusterExtensions)
\ No newline at end of file
#include "DisplayClusterPawnCAVE.h"
#include "Cluster/IDisplayClusterClusterManager.h"
#include "Engine/World.h"
#include "Game/IDisplayClusterGameManager.h"
#include "GameFramework/WorldSettings.h"
#include "Input/IDisplayClusterInputManager.h"
#include "Kismet/GameplayStatics.h"
#include "DisplayClusterSettings.h"
#include "IDisplayCluster.h"
ADisplayClusterPawnCAVE::ADisplayClusterPawnCAVE(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
MovementComponent = CreateDefaultSubobject<UFloatingPawnMovement> (TEXT("MovementComponent0"));
MovementComponent->UpdatedComponent = RootComponent;
RotatingComponent = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent0"));
RotatingComponent->UpdatedComponent = RootComponent;
RotatingComponent->bRotationInLocalSpace = false;
RotatingComponent->PivotTranslation = FVector::ZeroVector;
RotatingComponent->RotationRate = FRotator::ZeroRotator;
}
void ADisplayClusterPawnCAVE::OnForward_Implementation (float Value)
{
if (Flystick)
{
if (IDisplayCluster::Get().GetClusterMgr()->IsMaster())
AddMovementInput(Flystick->GetForwardVector(), Value);
}
else
{
AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetForwardVector(), Value);
}
}
void ADisplayClusterPawnCAVE::OnRight_Implementation (float Value)
{
if (Flystick)
{
if (IDisplayCluster::Get().GetClusterMgr()->IsMaster())
AddMovementInput(Flystick->GetRightVector(), Value);
}
else
{
AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetRightVector(), Value);
}
}
void ADisplayClusterPawnCAVE::OnTurnRate_Implementation (float Rate )
{
if (Flystick)
{
if (!RotatingComponent->UpdatedComponent || !IDisplayCluster::Get().GetGameMgr() || !IDisplayCluster::Get().GetGameMgr()->GetActiveCamera()) return;
const FVector CameraLocation = IDisplayCluster::Get().GetGameMgr()->GetActiveCamera()->GetComponentLocation();
RotatingComponent->PivotTranslation = RotatingComponent->UpdatedComponent->GetComponentTransform().InverseTransformPositionNoScale(CameraLocation);
RotatingComponent->RotationRate = FRotator(RotatingComponent->RotationRate.Pitch, Rate * BaseTurnRate, 0.0f);
}
else
{
AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
}
}
void ADisplayClusterPawnCAVE::OnLookUpRate_Implementation(float Rate )
{
if (Flystick)
{
// User-centered projection causes motion sickness on look up interaction hence not implemented.
}
else
{
AddControllerPitchInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
}
}
void ADisplayClusterPawnCAVE::OnFire_Implementation ()
{
}
void ADisplayClusterPawnCAVE::OnAction_Implementation (int32 Index)
{
}
void ADisplayClusterPawnCAVE::BeginPlay ()
{
Super::BeginPlay();
if (!IDisplayCluster::Get().IsModuleInitialized() || !IDisplayCluster::Get().IsAvailable()) return;
auto IsCluster = (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster);
bUseControllerRotationYaw = !IsCluster;
bUseControllerRotationPitch = !IsCluster;
bUseControllerRotationRoll = !IsCluster;
TArray<AActor*> SettingsActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ADisplayClusterSettings::StaticClass(), SettingsActors);
if (SettingsActors.Num() == 0) return;
ADisplayClusterSettings* Settings = Cast<ADisplayClusterSettings>(SettingsActors[0]);
MovementComponent->MaxSpeed = Settings->MovementMaxSpeed ;
MovementComponent->Acceleration = Settings->MovementAcceleration;
MovementComponent->Deceleration = Settings->MovementDeceleration;
MovementComponent->TurningBoost = Settings->MovementTurningBoost;
BaseTurnRate = Settings->RotationSpeed ;
}
void ADisplayClusterPawnCAVE::Tick (float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
// Is this really necessary?
const float Mult = GetWorld()->GetWorldSettings()->WorldToMeters / 100.f;
SetActorScale3D(FVector(Mult, Mult, Mult));
if (!Flystick)
Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById(TEXT("flystick")); // There MUST be an scene node called flystick in the config.
}
void ADisplayClusterPawnCAVE::BeginDestroy ()
{
Super::BeginDestroy();
}
void ADisplayClusterPawnCAVE::SetupPlayerInputComponent (UInputComponent* PlayerInputComponent)
{
check(PlayerInputComponent);
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (PlayerInputComponent)
{
PlayerInputComponent->BindAxis ("MoveForward" , this, &ADisplayClusterPawnCAVE::OnForward );
PlayerInputComponent->BindAxis ("MoveRight" , this, &ADisplayClusterPawnCAVE::OnRight );
PlayerInputComponent->BindAxis ("TurnRate" , this, &ADisplayClusterPawnCAVE::OnTurnRate );
PlayerInputComponent->BindAxis ("LookUpRate" , this, &ADisplayClusterPawnCAVE::OnLookUpRate);
PlayerInputComponent->BindAction ("Fire" , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnFire );
PlayerInputComponent->BindAction<FButtonDelegate>("Action1" , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 1);
PlayerInputComponent->BindAction<FButtonDelegate>("Action2" , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 2);
PlayerInputComponent->BindAction<FButtonDelegate>("Action3" , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 3);
PlayerInputComponent->BindAction<FButtonDelegate>("Action4" , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 4);
PlayerInputComponent->BindAction<FButtonDelegate>("Action5" , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 5);
}
}
UPawnMovementComponent* ADisplayClusterPawnCAVE::GetMovementComponent () const
{
return MovementComponent;
}
......@@ -3,7 +3,7 @@
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
class NDISPLAYEXTENSIONS_API FnDisplayExtensionsModule : public IModuleInterface
class FDisplayClusterExtensionsModule : public IModuleInterface
{
public:
virtual void StartupModule () override;
......
......@@ -2,10 +2,11 @@
#include "CoreMinimal.h"
#include "DisplayClusterGameMode.h"
#include "DisplayClusterGameModeCAVE.generated.h"
UCLASS()
class NDISPLAYEXTENSIONS_API ADisplayClusterGameModeCAVE : public ADisplayClusterGameMode
class DISPLAYCLUSTEREXTENSIONS_API ADisplayClusterGameModeCAVE : public ADisplayClusterGameMode
{
GENERATED_BODY()
......
#pragma once
#include "GameFramework/FloatingPawnMovement.h"
#include "GameFramework/PawnMovementComponent.h"
#include "GameFramework/RotatingMovementComponent.h"
#include "CoreMinimal.h"
#include "DisplayClusterPawn.h"
#include "DisplayClusterSceneComponent.h"
#include "DisplayClusterPawnCAVE.generated.h"
UCLASS()
class DISPLAYCLUSTEREXTENSIONS_API ADisplayClusterPawnCAVE : public ADisplayClusterPawn
{
GENERATED_UCLASS_BODY()
public:
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnForward (float Value);
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnRight (float Value);
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnTurnRate (float Rate );
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnLookUpRate(float Rate );
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnFire ();
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnAction (int32 Index);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseTurnRate = 45.0f ;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") UDisplayClusterSceneComponent* Flystick = nullptr;
protected:
DECLARE_DELEGATE_OneParam(FButtonDelegate, int32);
virtual void BeginPlay () override;
virtual void Tick (float DeltaSeconds ) override;
virtual void BeginDestroy () override;
virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
virtual UPawnMovementComponent* GetMovementComponent () const override;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UFloatingPawnMovement* MovementComponent = nullptr;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent = nullptr;
};
#include "DisplayClusterPawnBase.h"
#include "Engine/World.h"
#include "Game/IDisplayClusterGameManager.h"
#include "GameFramework/WorldSettings.h"
#include "DisplayClusterSceneComponentSyncParent.h"
#include "DisplayClusterSettings.h"
#include "DisplayClusterGameMode.h"
#include "IDisplayCluster.h"
#include "Kismet/GameplayStatics.h"
ADisplayClusterPawnBase::ADisplayClusterPawnBase(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
MovementComponent = CreateDefaultSubobject<UFloatingPawnMovement> (TEXT("MovementComponent0"));
MovementComponent->UpdatedComponent = RootComponent;
RotatingComponent = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent0"));
RotatingComponent->UpdatedComponent = RootComponent;
RotatingComponent->bRotationInLocalSpace = true;
RotatingComponent->PivotTranslation = FVector::ZeroVector;
RotatingComponent->RotationRate = FRotator::ZeroRotator;
RotatingComponent2 = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent1"));
RotatingComponent2->UpdatedComponent = RootComponent;
RotatingComponent2->bRotationInLocalSpace = false;
RotatingComponent2->PivotTranslation = FVector::ZeroVector;
RotatingComponent2->RotationRate = FRotator::ZeroRotator;
BaseTurnRate = 45.f;
BaseLookUpRate = 45.f;
}
void ADisplayClusterPawnBase::MoveForward (float Value)
{
if (Value == 0.f) return;
AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetForwardVector(), Value);
}
void ADisplayClusterPawnBase::MoveRight (float Value)
{
if (Value == 0.f) return;
AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetRightVector (), Value);
}
void ADisplayClusterPawnBase::MoveUp (float Value)
{
if (Value == 0.f) return;
AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetUpVector (), Value);
}
void ADisplayClusterPawnBase::TurnAtRate (float Rate )
{
if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
{
if (!RotatingComponent->UpdatedComponent) return;
auto Manager = IDisplayCluster::Get().GetGameMgr();
if (!Manager) return;
auto Camera = Manager->GetActiveCamera();
if (!Camera ) return;
const FTransform TransformToRotate = RotatingComponent->UpdatedComponent->GetComponentTransform();
const FVector RotateAroundPivot = TransformToRotate.InverseTransformPositionNoScale(Camera->GetComponentLocation());
RotatingComponent->PivotTranslation = RotateAroundPivot;
RotatingComponent->RotationRate = FRotator(RotatingComponent->RotationRate.Pitch, Rate * BaseTurnRate, 0.f);
}
else if (Rate != 0.f)
AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
}
void ADisplayClusterPawnBase::TurnAtRate2 (float Rate )
{
if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
{
if (!RotatingComponent2->UpdatedComponent) return;
auto Manager = IDisplayCluster::Get().GetGameMgr();
if (!Manager) return;
auto Camera = Manager->GetActiveCamera();
if (!Camera ) return;
const FTransform TransformToRotate = RotatingComponent2->UpdatedComponent->GetComponentTransform();
const FVector RotateAroundPivot = TransformToRotate.InverseTransformPositionNoScale(Camera->GetComponentLocation());
RotatingComponent2->PivotTranslation = RotateAroundPivot;
RotatingComponent2->RotationRate = FRotator(RotatingComponent2->RotationRate.Pitch, Rate * BaseTurnRate, 0.f);
}
else if (Rate != 0.f)
AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
}
void ADisplayClusterPawnBase::LookUpAtRate(float Rate )
{
if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
{
//@note: usually CAVE-like systems don't use roll and pitch rotation since it can cause dizziness.
#if 0
//@todo: rotate around active camera
auto Manager = IDisplayCluster::Get().GetGameMgr();
if (!Manager) return;
auto Camera = Manager->GetActiveCamera();
if (!Camera ) return;
RotatingComponent->bRotationInLocalSpace = true;
RotatingComponent->PivotTranslation = FVector::ZeroVector;
#endif
}
else if (Rate != 0.f)
{
AddControllerPitchInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
}
}
void ADisplayClusterPawnBase::BeginPlay ()
{
Super::BeginPlay();
if (!IDisplayCluster::Get().IsModuleInitialized() || !IDisplayCluster::Get().IsAvailable()) return;
auto IsCluster = (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster);
bUseControllerRotationYaw = !IsCluster;
bUseControllerRotationPitch = !IsCluster;
bUseControllerRotationRoll = !IsCluster;
TArray<AActor*> SettingsActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ADisplayClusterSettings::StaticClass(), SettingsActors);
if (SettingsActors.Num() == 0) return;
ADisplayClusterSettings* Settings = Cast<ADisplayClusterSettings>(SettingsActors[0]);
MovementComponent->MaxSpeed = Settings->MovementMaxSpeed;
MovementComponent->Acceleration = Settings->MovementAcceleration;
MovementComponent->Deceleration = Settings->MovementDeceleration;
MovementComponent->TurningBoost = Settings->MovementTurningBoost;
BaseTurnRate = Settings->RotationSpeed;
BaseLookUpRate = Settings->RotationSpeed;
}
void ADisplayClusterPawnBase::Tick (float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
const float Mult = GetWorld()->GetWorldSettings()->WorldToMeters / 100.f;
SetActorScale3D(FVector(Mult, Mult, Mult));
}
UPawnMovementComponent* ADisplayClusterPawnBase::GetMovementComponent() const
{
return MovementComponent;
}
void ADisplayClusterPawnBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
check(PlayerInputComponent);
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (PlayerInputComponent)
{
PlayerInputComponent->BindAxis("MoveForward", this, &ADisplayClusterPawnBase::MoveForward );
PlayerInputComponent->BindAxis("MoveRight" , this, &ADisplayClusterPawnBase::MoveRight );
PlayerInputComponent->BindAxis("MoveUp" , this, &ADisplayClusterPawnBase::MoveUp );
PlayerInputComponent->BindAxis("TurnRate" , this, &ADisplayClusterPawnBase::TurnAtRate2 );
PlayerInputComponent->BindAxis("LookUpRate" , this, &ADisplayClusterPawnBase::LookUpAtRate);
}
}
#include "DisplayClusterPawnCAVE.h"
#include "Game/IDisplayClusterGameManager.h"
#include "IDisplayCluster.h"
void ADisplayClusterPawnCAVE::BeginPlay()
{
Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById("flystick");
}
void ADisplayClusterPawnCAVE::MoveForward(float value)
{
if (!Flystick)
Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById("flystick");
if (!Flystick || value == 0.0f)
return;
AddMovementInput(Flystick->GetForwardVector(), value);
}
#include "nDisplayExtensions.h"
#define LOCTEXT_NAMESPACE "FnDisplayExtensionsModule"
void FnDisplayExtensionsModule::StartupModule()
{
}
void FnDisplayExtensionsModule::ShutdownModule()
{
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FnDisplayExtensionsModule, nDisplayExtensions)
\ No newline at end of file
#pragma once
#include "Components/InputComponent.h"
#include "GameFramework/FloatingPawnMovement.h"
#include "GameFramework/PawnMovementComponent.h"
#include "GameFramework/RotatingMovementComponent.h"
#include "CoreMinimal.h"
#include "DisplayClusterPawn.h"
#include "DisplayClusterPawnBase.generated.h"
UCLASS()
class NDISPLAYEXTENSIONS_API ADisplayClusterPawnBase : public ADisplayClusterPawn
{
GENERATED_UCLASS_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveForward (float Value);
UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveRight (float Value);
UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveUp (float Value);
UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void TurnAtRate (float Rate );
UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void TurnAtRate2 (float Rate );
UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void LookUpAtRate(float Rate );
virtual void BeginPlay () override;
virtual void Tick (float DeltaSeconds) override;
virtual UPawnMovementComponent* GetMovementComponent() const override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseTurnRate ;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseLookUpRate;
protected:
virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) UFloatingPawnMovement* MovementComponent ;
UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent ;
UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent2;
};
\ No newline at end of file
#pragma once
#include "CoreMinimal.h"
#include "DisplayClusterPawnBase.h"
#include "DisplayClusterSceneComponent.h"
#include "DisplayClusterPawnCAVE.generated.h"
UCLASS()
class NDISPLAYEXTENSIONS_API ADisplayClusterPawnCAVE : public ADisplayClusterPawnBase
{
GENERATED_BODY()
public:
virtual void BeginPlay() override;
virtual void MoveForward(float value) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Pawn")
UDisplayClusterSceneComponent* Flystick = nullptr;
};
......@@ -13,9 +13,10 @@
"CanContainContent": true,
"IsBetaVersion": false,
"Installed": false,
"EnabledByDefault": true,
"Modules": [
{
"Name": "nDisplayExtensions",
"Name": "DisplayClusterExtensions",
"Type": "Developer",
"LoadingPhase": "Default"
}
......@@ -24,6 +25,10 @@
{
"Name": "nDisplay",
"Enabled": true
},
{
"Name": "nDisplayInput",
"Enabled": true
}
]
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment