Files
se.su.dsv.mediastudio.livel…/Runtime/Unity.FreeD/FreeDReceiver.cs

205 lines
6.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Unity.Collections;
using UnityEditor;
using UnityEngine;
using UnityEngine.TextCore.Text;
namespace FreeD
{
[RequireComponent(typeof(Camera))]
[ExecuteInEditMode]
public class FreeDReceiver : MonoBehaviour
{
public enum CameraModel
{
UE150,
UE100
}
[Header("Camera Model")]
public CameraModel cameraModel = CameraModel.UE150;
[Header("Zoom Calibration")]
// ZOOM KURVA
public AnimationCurve zoomCurve = AnimationCurve.Linear(0f, 1f, 1f, 1f);
//
public float freedZoomMin = 1365f;
public float freedZoomMax = 4049f;
public float focalLengthMin = 16.99f;
public float focalLengthMax = 328.99f;
public int cameraId;
[Header("Listening on port")]
public int listeningPort = 40_000;
[Tooltip("Run the server in edit mode")]
public new bool runInEditMode = true;
[Tooltip("Show received messages in Unity console")]
public bool showPacketInConsole = true;
private string latestMessage;
[Tooltip("Apply the values received to the gameObject")]
public bool apply = true;
FreeDServer server;
Packet packet;
public Packet lastPacket;
void OnEnable()
{
if (!Application.isPlaying && !runInEditMode) return;
server = FreeDServer.Get(listeningPort);
server.received += OnPacketReceived;
SetUpZoomCurve();
}
void OnDisable()
{
if (server == null) return;
server.received -= OnPacketReceived;
server.Stop();
}
// ZOOM SAKER
void OnValidate()
{
SetUpZoomCurve();
}
void SetUpZoomCurve()
{
zoomCurve = new AnimationCurve();
if (cameraModel == CameraModel.UE150)
{
// Kamera 1 och 2 - lägg till mätpunkter här
zoomCurve.AddKey(0.000f, 16.99f); // zoom 1365
zoomCurve.AddKey(0.018f, 17.997f); // zoom 1413
zoomCurve.AddKey(0.119f, 26.2f); // zoom 1688
zoomCurve.AddKey(0.479f, 64.0f); // zoom 2671
zoomCurve.AddKey(0.600f, 72.0f); // zoom 3000
zoomCurve.AddKey(1.000f, 328.99f); // zoom 4094 - ännu ej mätt
}
else if (cameraModel == CameraModel.UE100)
{
// Kamera 3
zoomCurve.AddKey(0.000f, 3.98f); // zoom 1365
zoomCurve.AddKey(0.085f, 5.25f); // zoom 1596
zoomCurve.AddKey(0.550f, 17.80f); // zoom 2866
zoomCurve.AddKey(0.791f, 32.54f); // zoom 3510
}
}
private void OnPacketReceived(Packet packet)
{
if (packet.Id != cameraId) return;
this.packet = packet;
if (showPacketInConsole)
latestMessage = $"Receiving Camera ID {packet.Id}: {packet.Id},{packet.Pan},{packet.Tilt},{packet.Roll},{packet.PosZ},{packet.PosX},{packet.PosY},{packet.Zoom},{packet.Focus}";
}
void Update()
{
if (!Application.isPlaying && !runInEditMode) return;
if (packet == null) return;
lastPacket = packet;
if (!apply) return;
//transform.localPosition = new Vector3(packet.PosX / 1000f, packet.PosY / 1000f, -packet.PosZ / 1000f);
transform.localRotation = Quaternion.identity;
transform.Rotate(Vector3.up, packet.Pan);
//transform.Rotate(Vector3.up, 90f);
transform.Rotate(Vector3.right, -packet.Tilt);
transform.Rotate(Vector3.forward, -packet.Roll);
var camera = GetComponent<Camera>();
if (camera != null)
{
//if(packet.Zoom > 0) camera.fieldOfView = (packet.Zoom * ( (19f-169f) / (63f-21f) ) ) + 100f;
// camera.focusDistance = -packet.Focus / 1000f;
// ÄNDRA ZOOM
if (packet.Zoom > 0)
{
//float t = (packet.Zoom - freedZoomMin) / (freedZoomMax - freedZoomMin);
//float focal = Mathf.Lerp(focalLengthMin, focalLengthMax, t);
//camera.focalLength = Mathf.Clamp(focal, focalLengthMin, focalLengthMax);
//zoom kurva
float t = (packet.Zoom - freedZoomMin) / (freedZoomMax - freedZoomMin);
camera.focalLength = zoomCurve.Evaluate(t);
}
Debug.Log($"RAW Zoom: {packet.Zoom}");
}
packet = null;
}
void OnDrawGizmos()
{
#if UNITY_EDITOR
if (!Application.isPlaying)
{
UnityEditor.EditorApplication.QueuePlayerLoopUpdate();
UnityEditor.SceneView.RepaintAll();
}
#endif
}
private void OnGUI()
{
Rect rectPosOnScreen = new Rect(0, 10 + (cameraId * 20f), Screen.width, 0.05f * Screen.height);
if (showPacketInConsole)
{
GUIStyle textStyle = new GUIStyle(GUI.skin.label);
textStyle.normal.textColor = Color.green;
textStyle.fontSize = 10;
GUI.Label(rectPosOnScreen, latestMessage, textStyle);
}
else
{
GUI.Label(rectPosOnScreen, "");
}
}
}
#if UNITY_EDITOR
[CustomEditor(typeof(FreeDReceiver))]
public class FreeDReceiverEditor : Editor
{
public override void OnInspectorGUI()
{
FreeDReceiver myScript = (FreeDReceiver)target;
if (myScript.enabled)
{
if (GUILayout.Button($"Stop Receiving from Camera ID {myScript.cameraId}"))
{
myScript.enabled = false;
myScript.apply= false;
}
}
else
{
if (GUILayout.Button($"Start Receiving from Camera ID {myScript.cameraId}"))
{
myScript.enabled = true;
myScript.apply = true;
}
}
DrawDefaultInspector();
}
}
#endif
}