1
0
KF2-Dev-Scripts/GameFramework/Classes/DebugCameraController.uc
2020-12-13 18:01:13 +03:00

279 lines
7.8 KiB
Ucode

//-----------------------------------------------------------
// Debug Camera Controller
//
// To turn it on, please press Alt+C or both (left and right) analogs on xbox pad
// After turning:
// WASD | Left Analog - moving
// Mouse | Right Analog - rotating
// Shift | XBOX_KeyB - move faster
// Q/E | LT/RT - move Up/Down
// Enter | XBOX_KeyA - to call "FreezeRendering" console command
// Alt+C | LeftThumbstick - to toggle debug camera
//
// * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
//-----------------------------------------------------------
class DebugCameraController extends GamePlayerController
config(Input)
native;
/** The key that triggers PrimarySelect(). */
var globalconfig name PrimaryKey;
/** The key that triggers SecondarySelect(). */
var globalconfig name SecondaryKey;
/** The key that triggers Unselect(). */
var globalconfig name UnselectKey;
/** Whether to show information about the selected actor on the debug camera HUD. */
var globalconfig bool bShowSelectedInfo;
/** When true the debug text is drawn. This is passed through from CheatManager's ToggleDebugCamera exec function. */
var bool bDrawDebugText;
/** HUD class to spawn. */
var class<HUD> HUDClass;
var PlayerController OriginalControllerRef;
var Player OriginalPlayer;
var bool bIsFrozenRendering;
var DrawFrustumComponent DrawFrustum;
var Actor SelectedActor;
var PrimitiveComponent SelectedComponent;
/**
* Called when an actor has been selected with the primary key (e.g. left mouse button).
*
* @param HitLoc World-space position of the selection point.
* @param HitNormal World-space normal of the selection point.
* @param HitInfo Info struct for the selection point.
*/
native function PrimarySelect( vector HitLoc, vector HitNormal, TraceHitInfo HitInfo );
/**
* Called when an actor has been selected with the secondary key (e.g. right mouse button).
*
* @param HitLoc World-space position of the selection point.
* @param HitNormal World-space normal of the selection point.
* @param HitInfo Info struct for the selection point.
*/
native function SecondarySelect( vector HitLoc, vector HitNormal, TraceHitInfo HitInfo );
/**
* Called when the user pressed the unselect key, just before the selected actor is cleared.
*/
native function Unselect();
simulated event PostBeginPlay()
{
super.PostBeginPlay();
// if hud is existing, delete it and create new hud for debug camera
if ( myHUD != None )
myHUD.Destroy();
myHUD = Spawn( HUDClass, self);
}
/*
* Function called on activation debug camera controller
*/
function OnActivate( PlayerController PC )
{
if ( DebugCameraHUD(myHUD) != None )
{
DebugCameraHUD(myHUD).bDrawDebugText = bDrawDebugText;
}
if(DrawFrustum==None)
{
DrawFrustum = new(PC.PlayerCamera) class'DrawFrustumComponent';
}
if ( bDrawDebugText )
{
DrawFrustum.SetHidden( false );
ConsoleCommand("show camfrustums true");
}
else
{
DrawFrustum.SetHidden( true );
ConsoleCommand("show camfrustums false");
}
PC.SetHidden(false);
PC.PlayerCamera.SetHidden(false);
DrawFrustum.FrustumAngle = PC.PlayerCamera.CameraCache.POV.FOV;
DrawFrustum.SetAbsolute(true, true, false);
DrawFrustum.SetTranslation(PC.PlayerCamera.CameraCache.POV.Location);
DrawFrustum.SetRotation(PC.PlayerCamera.CameraCache.POV.Rotation);
PC.PlayerCamera.AttachComponent(DrawFrustum);
}
/**
* Function called on deactivation debug camera controller
*/
function OnDeactivate( PlayerController PC )
{
DrawFrustum.SetHidden( true );
PC.PlayerCamera.DetachComponent(DrawFrustum);
PC.SetHidden(true);
PC.PlayerCamera.SetHidden(true);
}
//function called from key bindings command to save information about
// turning on/off FreezeRendering command.
exec function SetFreezeRendering()
{
ConsoleCommand("FreezeRendering");
bIsFrozenRendering = !bIsFrozenRendering;
}
//function called from key bindings command
exec function MoreSpeed()
{
bRun = 2;
}
//function called from key bindings command
exec function NormalSpeed()
{
bRun = 0;
}
/*
* Switch from debug camera controller to local player controller
*/
function DisableDebugCamera()
{
if( OriginalControllerRef != none )
{
// restore FreezeRendering command state before quite
if( bIsFrozenRendering==true ) {
ConsoleCommand("FreezeRendering");
bIsFrozenRendering = false;
}
if( OriginalPlayer != none )
{
OriginalPlayer.SwitchController( OriginalControllerRef );
OriginalControllerRef.InitInputSystem();
OnDeactivate( self );
}
}
}
/*
* Does any controller/input necessary initialization.
*/
function InitDebugInputSystem()
{
OriginalControllerRef.PlayerInput.InitInputSystem();
OriginalControllerRef.InitInputSystem();
}
auto state PlayerWaiting
{
function PlayerMove(float DeltaTime)
{
local float UndilatedDeltaTime;
UndilatedDeltaTime = DeltaTime / WorldInfo.TimeDilation;
super.PlayerMove(UndilatedDeltaTime);
if (WorldInfo.Pauser != None)
{
PlayerCamera.UpdateCamera(DeltaTime);
}
}
};
/**
* Called from DebugCameraInput
* Process an input key event routed through unrealscript from another object. This method is assigned as the value for the
* OnRecievedNativeInputKey delegate so that native input events are routed to this unrealscript function.
*
* @param ControllerId the controller that generated this input key event
* @param Key the name of the key which an event occured for (KEY_Up, KEY_Down, etc.)
* @param EventType the type of event which occured (pressed, released, etc.)
* @param AmountDepressed for analog keys, the depression percent.
*
* @return true to consume the key event, false to pass it on.
*/
function bool NativeInputKey( int ControllerId, name Key, EInputEvent Event, float AmountDepressed = 1.f, bool bGamepad = FALSE )
{
local vector CamLoc, ZeroVec;
local rotator CamRot;
local TraceHitInfo HitInfo;
local Actor HitActor;
local vector HitLoc, HitNormal;
CamLoc = PlayerCamera.CameraCache.POV.Location;
CamRot = PlayerCamera.CameraCache.POV.Rotation;
if ( Event == IE_Pressed )
{
if ( Key == UnselectKey )
{
Unselect();
SelectedActor = None;
SelectedComponent = None;
return true;
}
if ( Key == PrimaryKey )
{
HitActor = Trace(HitLoc, HitNormal, vector(camRot) * 5000 * 20 + CamLoc, CamLoc, true, ZeroVec, HitInfo);
if( HitActor != None)
{
SelectedActor = HitActor;
SelectedComponent = HitInfo.HitComponent;
PrimarySelect( HitLoc, HitNormal, HitInfo );
}
return true;
}
if ( Key == SecondaryKey )
{
HitActor = Trace(HitLoc, HitNormal, vector(camRot) * 5000 * 20 + CamLoc, CamLoc, true, ZeroVec, HitInfo);
if( HitActor != None)
{
SelectedActor = HitActor;
SelectedComponent = HitInfo.HitComponent;
SecondarySelect( HitLoc, HitNormal, HitInfo );
}
return true;
}
}
return false;
}
exec function ShowDebugSelectedInfo()
{
bShowSelectedInfo = !bShowSelectedInfo;
}
/** Overridden to potentially pipe commands to regular PlayerController */
native function string ConsoleCommand(string Command, optional bool bWriteToLog = true);
cpptext
{
/**
* Builds a list of components that are hidden based upon gameplay
*
* @param ViewLocation the view point to hide/unhide from
* @param HiddenComponents the list to add to/remove from
*/
virtual void UpdateHiddenComponents(const FVector& ViewLocation,TSet<UPrimitiveComponent*>& HiddenComponents);
}
defaultproperties
{
InputClass=class'GameFramework.DebugCameraInput'
OriginalControllerRef=None
OriginalPlayer=None
bIsFrozenRendering=false
DrawFrustum=none
bHidden=FALSE
bHiddenEd=FALSE
bDrawDebugText=true
HUDClass=class'DebugCameraHUD'
bAlwaysTick=TRUE
}