WorkInProgress/FreeCamGameObjectSystem.cs
using Sandbox.Utility;
using static Sandbox.Component;
public sealed class FreeCamGameObjectSystem : GameObjectSystem, ISceneStage
{
public bool IsActive { get; set; }
Vector3 position;
Vector3 smoothPosition;
Angles angles;
Angles smoothAngles;
float fov = 80;
float smoothFov = 80;
public FreeCamGameObjectSystem( Scene scene ) : base( scene )
{
}
void ISceneStage.Start()
{
if ( !IsActive )
return;
Input.Suppressed = true;
}
void ISceneStage.End()
{
if ( IsActive )
{
Input.Suppressed = false;
}
if ( Input.Keyboard.Pressed( "J" ) )
{
IsActive = !IsActive;
if ( IsActive )
{
smoothPosition = Scene.Camera.WorldPosition;
position = smoothPosition + Scene.Camera.WorldRotation.Backward * 50;
angles = smoothAngles = Scene.Camera.WorldRotation;
smoothFov = fov = Scene.Camera.FieldOfView;
Scene.TimeScale = 0;
}
else
{
Scene.TimeScale = 1;
}
}
if ( !IsActive )
return;
UpdateCameraPosition();
}
void UpdateCameraPosition()
{
var speed = 50;
if ( Input.Down( "duck" ) ) speed = 5;
if ( Input.Down( "run" ) ) speed = 500;
if ( Input.Down( "attack2" ) )
{
fov += Input.MouseDelta.y * 0.1f;
fov = fov.Clamp( 1, 120 );
}
else
{
angles += Input.AnalogLook * fov.Remap( 1, 100, 0.1f, 1 );
}
var velocity = angles.ToRotation() * Input.AnalogMove * speed;
position += velocity * RealTime.SmoothDelta;
smoothPosition = smoothPosition.LerpTo( position, RealTime.SmoothDelta * 3.0f );
Scene.Camera.WorldPosition = smoothPosition;
smoothAngles = smoothAngles.LerpTo( angles, RealTime.SmoothDelta * 5.0f );
Scene.Camera.WorldRotation = smoothAngles + new Angles( Noise.Fbm( 2, Time.Now * 40, 1 ) * 2, Noise.Fbm( 2, Time.Now * 30, 60 ) * 2, 0 );
smoothFov = smoothFov.LerpTo( fov, RealTime.SmoothDelta * 20.0f );
Scene.Camera.FieldOfView = smoothFov;
Scene.Camera.RenderExcludeTags.Remove( "viewer" );
}
}