Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 28 additions & 14 deletions FreeCam/Components/CustomLookAround.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ public class CustomLookAround : MonoBehaviour
private float _moveY;
private float _moveZ;

private float _moveSpeed = 1f;
private float _moveSpeed = 5f;
public float MoveSpeed {
get { return _moveSpeed; }
}

void Start() => Cursor.lockState = CursorLockMode.Locked;

Expand All @@ -23,29 +26,40 @@ void Update()
return;
}

var scrollInOut = Mouse.current.scroll.y.ReadValue();
_moveSpeed = Math.Max(_moveSpeed + scrollInOut * 0.05f, 0f);
var scrollInOut =
Math.Max(-1f, Math.Min(1f, Mouse.current.scroll.y.ReadValue())) +
InputLibrary.toolOptionUp.GetValue() - InputLibrary.toolOptionDown.GetValue();
_moveSpeed = (float)Math.Pow(Math.E, Math.Log(_moveSpeed) + scrollInOut * 0.1f);

if (Keyboard.current[Key.DownArrow].wasPressedThisFrame)
{
_moveSpeed = 0.1f;
_moveSpeed = 5f;
}

var look = InputLibrary.look.GetAxisValue(true);
_degreesY = look.y * 2f;
_degreesX = look.x * 2f;
var lookRate = OWInput.UsingGamepad() ? PlayerCameraController.GAMEPAD_LOOK_RATE_Y : PlayerCameraController.LOOK_RATE;

// Possibly this should use the ship input version? Since the freecam controls are more like flight
var look = OWInput.GetAxisValue(InputLibrary.look, InputMode.All);
_degreesY = look.y * lookRate * Time.unscaledDeltaTime;
_degreesX = look.x * lookRate * Time.unscaledDeltaTime;

var move = InputLibrary.moveXZ.GetAxisValue(false);
_moveX = move.x;
_moveZ = move.y;
_moveX = move.x * _moveSpeed * Time.unscaledDeltaTime;
_moveZ = move.y * _moveSpeed * Time.unscaledDeltaTime;

_moveY = OWInput.GetValue(InputLibrary.thrustUp) - OWInput.GetValue(InputLibrary.thrustDown);
_moveY = (OWInput.GetValue(InputLibrary.thrustUp) - OWInput.GetValue(InputLibrary.thrustDown)) * _moveSpeed * Time.unscaledDeltaTime;

transform.Rotate(Vector3.up, _degreesX);
if (OWInput.IsPressed(InputLibrary.rollMode)) {
transform.Rotate(Vector3.forward, -_degreesX);
}
else {
transform.Rotate(Vector3.up, _degreesX);
}
transform.Rotate(Vector3.right, -_degreesY);
transform.position += _moveZ * (transform.forward * 0.02f * _moveSpeed);
transform.position += _moveX * (transform.right * 0.02f * _moveSpeed);
transform.position += _moveY * (transform.up * 0.02f * _moveSpeed);

transform.position += _moveZ * transform.forward;
transform.position += _moveX * transform.right;
transform.position += _moveY * transform.up;

if (Keyboard.current[Key.Q].isPressed)
{
Expand Down
31 changes: 25 additions & 6 deletions FreeCam/Components/FreeCamController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,12 @@ public class FreeCamController : MonoBehaviour
};

public const Key TeleportKey = Key.T;
public const Key ReparentKey = Key.Y;

public static bool HoldingTeleport { get; private set; }

public void Start() => ParentToPlayer(true);

public void Update()
{
if (Keyboard.current[Key.NumpadDivide].wasPressedThisFrame || Keyboard.current[Key.Comma].wasPressedThisFrame)
Expand All @@ -49,24 +52,21 @@ public void Update()
}

HoldingTeleport = false;
if (Keyboard.current[TeleportKey].isPressed)
if (Keyboard.current[TeleportKey].isPressed || Keyboard.current[ReparentKey].isPressed)
{
HoldingTeleport = true;

if (Keyboard.current[CenterOnPlayerKey].wasPressedThisFrame || Keyboard.current[CenterOnPlayerKeyAlt].wasPressedThisFrame)
{
transform.parent = Locator.GetPlayerTransform();
transform.position = Locator.GetPlayerTransform().position;
ParentToPlayer(Keyboard.current[TeleportKey].isPressed);
}

foreach (var planet in CenterOnPlanetKey.Keys)
{
var (key, alt) = CenterOnPlanetKey[planet];
if (Keyboard.current[key].wasPressedThisFrame || Keyboard.current[alt].wasPressedThisFrame)
{
var go = Locator.GetAstroObject(planet).gameObject.transform;
transform.parent = go;
transform.position = go.position;
ParentToAstroObject(Locator.GetAstroObject(planet), Keyboard.current[TeleportKey].isPressed);
}
}
}
Expand All @@ -81,4 +81,23 @@ public void Update()
MainClass.ToggleFreeCam();
}
}

public void ParentToPlayer(bool warp = false)
{
var playerCameraTransform = Locator.GetPlayerCamera().transform;
transform.parent = playerCameraTransform;
if (warp) {
transform.position = playerCameraTransform.position;
transform.rotation = playerCameraTransform.rotation;
}
}

public void ParentToAstroObject(AstroObject astroObject, bool warp = false)
{
var astroObjectTransform = astroObject.gameObject.transform;
transform.parent = astroObjectTransform;
if (warp) {
transform.position = astroObjectTransform.position;
}
}
}
96 changes: 62 additions & 34 deletions FreeCam/Components/PromptController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ namespace FreeCam.Components;

public class PromptController : MonoBehaviour
{
private ScreenPrompt _togglePrompt, _guiPrompt, _teleportOptions, _scrollPrompt, _rotatePrompt, _horizontalPrompt, _verticalPrompt;
private ScreenPrompt _centerPrompt;
private List<ScreenPrompt> _planetPrompts;

private List<ScreenPrompt> _timePrompts;

private ScreenPrompt _flashlightPrompt, _flashlightRangePrompt, _flashlightSpeedPrompt;
private ScreenPrompt
_togglePrompt, _guiPrompt, _teleportOptions, _centerPlayerPrompt,
_scrollPromptKeyboard, _scrollPromptGamepad, _speedPrompt,
_rotatePrompt, _horizontalPrompt, _verticalPrompt, _lookPrompt,
_flashlightPrompt, _flashlightRangePrompt, _flashlightSpeedPrompt;
private List<ScreenPrompt> _planetPrompts, _timePrompts;

private CustomFlashlight _customFlashlight;
private CustomLookAround _customLookAround;

private static readonly UIInputCommands _rotateLeftCmd = new("FREECAM - RotateLeft", KeyCode.Q);
private static readonly UIInputCommands _rotateRightCmd = new("FREECAM - RotateRight", KeyCode.E);
Expand All @@ -27,66 +27,74 @@ public class PromptController : MonoBehaviour
private void Start()
{
_customFlashlight = GetComponent<CustomFlashlight>();

_customLookAround = GetComponent<CustomLookAround>();

// Top right
_togglePrompt = AddPrompt("Toggle FreeCam", PromptPosition.UpperLeft, FreeCamController.ToggleKey);
_guiPrompt = AddPrompt("Hide HUD", PromptPosition.UpperLeft, FreeCamController.GUIKey);

_scrollPrompt = new ScreenPrompt(_scrollCmd, _resetCmd, "Movement speed <CMD1> Reset <CMD2>", ScreenPrompt.MultiCommandType.CUSTOM_BOTH);
Locator.GetPromptManager().AddScreenPrompt(_scrollPrompt, PromptPosition.UpperLeft, false);

_horizontalPrompt = new ScreenPrompt(InputLibrary.moveXZ, "Move <CMD>");
Locator.GetPromptManager().AddScreenPrompt(_horizontalPrompt, PromptPosition.UpperLeft, false);
_scrollPromptKeyboard = AddPrompt("Change speed <CMD1> Reset <CMD2>", PromptPosition.UpperLeft, [_scrollCmd, _resetCmd], ScreenPrompt.MultiCommandType.CUSTOM_BOTH);
_scrollPromptGamepad = AddPrompt("Change speed <CMD>", PromptPosition.UpperLeft, [InputLibrary.toolOptionUp, InputLibrary.toolOptionDown], ScreenPrompt.MultiCommandType.POS_NEG);
_speedPrompt = AddPrompt("Speed: " + _customLookAround.MoveSpeed + " m/s", PromptPosition.UpperLeft);

_verticalPrompt = new ScreenPrompt(InputLibrary.thrustUp, InputLibrary.thrustDown, "Up/Down <CMD>", ScreenPrompt.MultiCommandType.POS_NEG);
Locator.GetPromptManager().AddScreenPrompt(_verticalPrompt, PromptPosition.UpperLeft, false);
_rotatePrompt = AddPrompt(
UITextLibrary.GetString(UITextType.RollPrompt) + " <CMD1>" + UITextLibrary.GetString(UITextType.HoldPrompt) + " +<CMD2>", PromptPosition.UpperLeft,
[InputLibrary.rollMode, InputLibrary.look], ScreenPrompt.MultiCommandType.CUSTOM_BOTH
);

_rotatePrompt = new ScreenPrompt(_rotateLeftCmd, _rotateRightCmd, "Rotate <CMD1> <CMD2>", ScreenPrompt.MultiCommandType.CUSTOM_BOTH);
Locator.GetPromptManager().AddScreenPrompt(_rotatePrompt, PromptPosition.UpperLeft, false);
_lookPrompt = AddPrompt(UITextLibrary.GetString(UITextType.LookPrompt) + " <CMD>", PromptPosition.UpperLeft, InputLibrary.look);
_horizontalPrompt = AddPrompt(UITextLibrary.GetString(UITextType.MovePrompt) + " <CMD>", PromptPosition.UpperLeft, InputLibrary.moveXZ);
_verticalPrompt = AddPrompt("Up/Down <CMD>", PromptPosition.UpperLeft, [InputLibrary.thrustUp, InputLibrary.thrustDown], ScreenPrompt.MultiCommandType.POS_NEG);

// Top Left
_teleportOptions = AddPrompt("Parent options <CMD>" + UITextLibrary.GetString(UITextType.HoldPrompt), PromptPosition.UpperRight, FreeCamController.TeleportKey);
_centerPrompt = AddPrompt("Player", PromptPosition.UpperRight, FreeCamController.CenterOnPlayerKey);
_centerPlayerPrompt = AddPrompt("Player", PromptPosition.UpperRight, FreeCamController.CenterOnPlayerKey);

_planetPrompts = new();
_planetPrompts = [];
foreach (var planet in FreeCamController.CenterOnPlanetKey.Keys)
{
_planetPrompts.Add(AddPrompt(AstroObject.AstroObjectNameToString(planet), PromptPosition.UpperRight, FreeCamController.CenterOnPlanetKey[planet].key));
}

// Flashlight
_flashlightPrompt = new ScreenPrompt(InputLibrary.flashlight, UITextLibrary.GetString(UITextType.FlashlightPrompt) + " <CMD>" + UITextLibrary.GetString(UITextType.PressPrompt));
Locator.GetPromptManager().AddScreenPrompt(_flashlightPrompt, PromptPosition.UpperLeft, false);

_flashlightRangePrompt = new ScreenPrompt(_rangeDown, _rangeUp, "Flashlight range <CMD1> <CMD2>", ScreenPrompt.MultiCommandType.CUSTOM_BOTH);
Locator.GetPromptManager().AddScreenPrompt(_flashlightRangePrompt, PromptPosition.UpperLeft, false);

_flashlightPrompt = AddPrompt(UITextLibrary.GetString(UITextType.FlashlightPrompt) + " <CMD>" + UITextLibrary.GetString(UITextType.PressPrompt), PromptPosition.UpperLeft, InputLibrary.flashlight);
_flashlightRangePrompt = AddPrompt("Flashlight range <CMD1> <CMD2>", PromptPosition.UpperLeft, [_rangeDown, _rangeUp], ScreenPrompt.MultiCommandType.CUSTOM_BOTH);
_flashlightSpeedPrompt = AddPrompt("Adjust range faster <CMD>" + UITextLibrary.GetString(UITextType.HoldPrompt), PromptPosition.UpperLeft, Key.RightShift);

_timePrompts = new()
{
_timePrompts = [
AddPrompt("0% game speed", PromptPosition.LowerLeft, Key.Comma),
AddPrompt("50% game speed", PromptPosition.LowerLeft, Key.Period),
AddPrompt("100% game speed", PromptPosition.LowerLeft, Key.Slash)
};
];
}

private void Update()
{
var visible = !OWTime.IsPaused() && !GUIMode.IsHiddenMode() && MainClass.ShowPrompts;
var visible = !OWTime.IsPaused() && !GUIMode.IsHiddenMode() && PlayerData.GetPromptsEnabled() && MainClass.ShowPrompts;

// Top right
_togglePrompt.SetVisibility(visible);

_guiPrompt.SetVisibility(visible && MainClass.InFreeCam);
_scrollPrompt.SetVisibility(visible && MainClass.InFreeCam);

var usingGamepad = Locator.GetPromptManager()._usingGamepad;
_scrollPromptGamepad.SetVisibility(visible && MainClass.InFreeCam && usingGamepad);
_scrollPromptKeyboard.SetVisibility(visible && MainClass.InFreeCam && !usingGamepad);

_speedPrompt.SetVisibility(visible && MainClass.InFreeCam);
var moveSpeed = _customLookAround.MoveSpeed;
string moveSpeedString;
if (moveSpeed < 0.01f || moveSpeed > 100f) { moveSpeedString = moveSpeed.ToString("0.000e0"); }
else { moveSpeedString = moveSpeed.ToString("0.000"); }
_speedPrompt.SetText("Speed: " + moveSpeedString + " m/s");

_rotatePrompt.SetVisibility(visible && MainClass.InFreeCam);
_lookPrompt.SetVisibility(visible && MainClass.InFreeCam);
_horizontalPrompt.SetVisibility(visible && MainClass.InFreeCam);
_verticalPrompt.SetVisibility(visible && MainClass.InFreeCam);
_rotatePrompt.SetVisibility(visible && MainClass.InFreeCam);

// Top left
_teleportOptions.SetVisibility(visible && MainClass.InFreeCam);
_centerPrompt.SetVisibility(visible && MainClass.InFreeCam && FreeCamController.HoldingTeleport);
_centerPlayerPrompt.SetVisibility(visible && MainClass.InFreeCam && FreeCamController.HoldingTeleport);
foreach (var planetPrompt in _planetPrompts)
{
planetPrompt.SetVisibility(visible && MainClass.InFreeCam && FreeCamController.HoldingTeleport);
Expand All @@ -107,7 +115,6 @@ private void Update()
private static ScreenPrompt AddPrompt(string text, PromptPosition position, Key key)
{
Enum.TryParse(key.ToString().Replace("Digit", "Alpha"), out KeyCode keyCode);

return AddPrompt(text, position, keyCode);
}

Expand All @@ -122,4 +129,25 @@ private static ScreenPrompt AddPrompt(string text, PromptPosition position, KeyC

return prompt;
}

private static ScreenPrompt AddPrompt(string text, PromptPosition position, IInputCommands cmd)
{
var prompt = new ScreenPrompt(cmd, text);
Locator.GetPromptManager().AddScreenPrompt(prompt, position, false);
return prompt;
}

private static ScreenPrompt AddPrompt(string text, PromptPosition position)
{
var prompt = new ScreenPrompt(text);
Locator.GetPromptManager().AddScreenPrompt(prompt, position, false);
return prompt;
}

private static ScreenPrompt AddPrompt(string text, PromptPosition position, List<IInputCommands> commands, ScreenPrompt.MultiCommandType cmdType)
{
var prompt = new ScreenPrompt(commands, text, cmdType);
Locator.GetPromptManager().AddScreenPrompt(prompt, position, false);
return prompt;
}
}