Compare commits

...

8 Commits

@ -1,7 +1,7 @@
ID: D4VID_CameraRoll
Name: CameraRoll
Author: D4VID
Version: 0.1.0
Version: 0.3.0
Priority: 0
ClientOnly: true
Dependencies:

@ -6,10 +6,12 @@ using LogicAPI.Client;
using LogicLog;
using LogicWorld;
using LogicWorld.GameStates;
using UnityEngine.SceneManagement;
namespace CameraRoll.Client {
public class CameraRollClientMod : ClientMod {
public new static ILogicLogger Logger = null!;
private const string MainMenuSceneName = "UI_MainMenu";
protected override void Initialize() {
Logger = base.Logger;
@ -30,6 +32,12 @@ namespace CameraRoll.Client {
return true;
}
);
SceneManager.sceneLoaded += (scene, _) => {
if (scene.name == MainMenuSceneName) {
CameraRollTool.OnExit();
}
};
Logger.Info("CameraRoll mod loaded");
}

@ -1,11 +1,15 @@
using System.Collections.Generic;
using System.Reflection;
using EccsLogicWorldAPI.Shared.AccessHelper;
using LogicLog;
using LogicWorld;
using UnityEngine;
namespace CameraRoll.Client.Tool {
public class CameraRollTool {
private static ILogicLogger _logger = null!;
private static Camera _cam;
private static PropertyInfo _showBuildingUI;
/// <summary>
/// How fast does it interpolate between points
@ -17,7 +21,7 @@ namespace CameraRoll.Client.Tool {
/// If the track is playing/animating/moving the camera
/// </summary>
private static bool _playing;
// Backup of the original (local) position and rotation of the camera
private static Vector3 _originalPosition;
private static Quaternion _originalRotation;
@ -38,6 +42,7 @@ namespace CameraRoll.Client.Tool {
_logger = logger;
PathPoints.Clear();
_playing = false;
_showBuildingUI = Properties.getPrivateStatic(typeof(FirstPersonInteraction), "ShowBuildingUI");
}
public static void OnEnter() {
@ -54,8 +59,19 @@ namespace CameraRoll.Client.Tool {
};
point.AddComponent<PathPoint>();
PathPoints.Add(point);
if (PathPoints.Count > 1) {
point.GetComponent<PathPoint>().LinkPreviousPoint(PathPoints[^2]);
}
}
public static void SetPointsVisible(bool visible) {
foreach (GameObject point in PathPoints) {
point.SetActive(visible);
}
}
public static void Play() {
if (_playing) return;
@ -64,7 +80,10 @@ namespace CameraRoll.Client.Tool {
_pointIndex = 0;
_interpolationState = 0.0f;
SetPointsVisible(false);
_showBuildingUI.SetValue(null, false); // Hide UI
_playing = true;
}
@ -74,6 +93,9 @@ namespace CameraRoll.Client.Tool {
_cam.transform.localPosition = _originalPosition;
_cam.transform.localRotation = _originalRotation;
SetPointsVisible(true);
_showBuildingUI.SetValue(null, true); // Show UI
}
public static void Clear() {
@ -102,16 +124,15 @@ namespace CameraRoll.Client.Tool {
}
_interpolationState += InterpolationSpeed;
Vector3 prevPos = GetPos(_pointIndex - 1);
Vector3 posDiff = GetPos(_pointIndex) - prevPos;
_cam.transform.position = prevPos + posDiff * _interpolationState;
Vector3 prevRot = GetRot(_pointIndex - 1);
Vector3 rotDiff = GetRot(_pointIndex) - prevRot;
_cam.transform.eulerAngles = prevRot + rotDiff * _interpolationState;
// TODO: interpolate across the shorter direction of rotation
Vector3 newPos = GetPos(_pointIndex);
_cam.transform.position = Vector3.Lerp(prevPos, newPos, _interpolationState);
Quaternion prevRot = GetRot(_pointIndex - 1);
Quaternion newRot = GetRot(_pointIndex);
_cam.transform.rotation = Quaternion.Slerp(prevRot, newRot, _interpolationState);
if (_interpolationState >= 1.0f) {
_pointIndex++;
_interpolationState = 0.0f;
@ -120,7 +141,7 @@ namespace CameraRoll.Client.Tool {
}
private static Vector3 GetPos(int index) => PathPoints[index].transform.position;
private static Vector3 GetRot(int index) => PathPoints[index].transform.eulerAngles;
private static Quaternion GetRot(int index) => PathPoints[index].transform.rotation;
public static void OnExit() {
Clear();

@ -2,24 +2,40 @@ using UnityEngine;
namespace CameraRoll.Client.Tool {
public class PathPoint : MonoBehaviour {
private const float AxisLength = 0.1f;
private const float AxisLength = 0.2f;
void Start() {
CreateAxis(Vector3.right, Color.red);
CreateAxis(Vector3.up, Color.green);
CreateAxis(Vector3.forward, Color.blue);
CreateAxis(Vector3.right, Color.red, false);
CreateAxis(Vector3.up, Color.green, false);
CreateAxis(Vector3.forward, Color.blue, true);
}
void CreateAxis(Vector3 dir, Color color) {
void CreateAxis(Vector3 dir, Color color, bool longer) {
GameObject line = new GameObject("Axis");
line.transform.SetParent(transform, false);
LineRenderer lr = line.AddComponent<LineRenderer>();
lr.useWorldSpace = false;
lr.positionCount = 2;
lr.SetPosition(0, dir.normalized * -AxisLength);
lr.SetPosition(1, dir.normalized * AxisLength);
lr.material = new Material(Shader.Find("Unlit/Color"));
lr.material.color = color;
lr.SetPosition(1, dir.normalized * (longer ? 3 * AxisLength : AxisLength));
lr.material = new Material(Shader.Find("Unlit/Color")) {
color = color
};
lr.startWidth = 0.02f;
lr.endWidth = 0.02f;
}
public void LinkPreviousPoint(GameObject point) {
GameObject line = new GameObject("Link");
line.transform.SetParent(transform, false);
LineRenderer lr = line.AddComponent<LineRenderer>();
lr.useWorldSpace = true;
lr.positionCount = 2;
lr.SetPosition(0, transform.position);
lr.SetPosition(1, point.transform.position);
lr.material = new Material(Shader.Find("Unlit/Color")) {
color = Color.magenta
};
lr.startWidth = 0.01f;
lr.endWidth = 0.01f;
}

Loading…
Cancel
Save