using System; using GameKit.Dependencies.Utilities; using UnityEngine; namespace FishNet.Object { public static class TransformPropertiesExtensions { /// /// Creates direction between two TransformProperties. /// /// Value to divide results by. /// public static TransformProperties CreateDirections(this TransformProperties prevProperties, TransformProperties nextProperties, uint divisor = 1) { //PROSTART Vector3 position = (nextProperties.Position - prevProperties.Position) / divisor; Quaternion rotation = nextProperties.Rotation.Subtract(prevProperties.Rotation); //If more than 1 tick span then get a portion of the rotation. if (divisor > 1) { float percent = (1f / (float)divisor); rotation = Quaternion.Lerp(Quaternion.identity, nextProperties.Rotation, percent); } Vector3 scale = (nextProperties.Scale - prevProperties.Scale) / divisor; return new(position, rotation, scale); } /// /// Sets values of TransformPropertiesCls to a transforms world properties. /// public static void SetWorldProperties(this TransformPropertiesCls tp, Transform t) { tp.Position = t.position; tp.Rotation = t.rotation; tp.LocalScale = t.localScale; } /// /// Sets values of TransformPropertiesCls to a transforms world properties. /// public static void SetWorldProperties(this TransformProperties tp, Transform t) { tp.Position = t.position; tp.Rotation = t.rotation; tp.Scale = t.localScale; } } [System.Serializable] public class TransformPropertiesCls : IResettable { public Vector3 Position; public Quaternion Rotation; public Vector3 LocalScale; public TransformPropertiesCls() { } public TransformPropertiesCls(Vector3 position, Quaternion rotation, Vector3 localScale) { Position = position; Rotation = rotation; LocalScale = localScale; } public void InitializeState() { } public void ResetState() { Update(Vector3.zero, Quaternion.identity, Vector3.zero); } public void Update(Transform t) { Update(t.position, t.rotation, t.localScale); } public void Update(TransformPropertiesCls tp) { Update(tp.Position, tp.Rotation, tp.LocalScale); } public void Update(TransformProperties tp) { Update(tp.Position, tp.Rotation, tp.Scale); } public void Update(Vector3 position, Quaternion rotation) { Update(position, rotation, LocalScale); } public void Update(Vector3 position, Quaternion rotation, Vector3 localScale) { Position = position; Rotation = rotation; LocalScale = localScale; } /// /// Returns if this TransformProperties equals anothers values. /// public bool ValuesEquals(TransformPropertiesCls properties) { return (this.Position == properties.Position && this.Rotation == properties.Rotation && this.LocalScale == properties.LocalScale); } /// /// Returns this classes values as the struct version of TransformProperties. /// /// public TransformProperties ToStruct() { TransformProperties result = new(Position, Rotation, LocalScale); return result; } } [System.Serializable] public struct TransformProperties { public Vector3 Position; public Quaternion Rotation; [Obsolete("Use Scale.")] //Remove V5 public Vector3 LocalScale => Scale; public Vector3 Scale; /// /// Becomes true when values are set through update or constructor. /// public bool IsValid; public TransformProperties(Vector3 position, Quaternion rotation, Vector3 localScale) { Position = position; Rotation = rotation; Scale = localScale; IsValid = true; } /// /// Creates a TransformProperties with default position and rotation, with Vector3.one scale. /// public static TransformProperties GetTransformDefault() => new(Vector3.zero, Quaternion.identity, Vector3.one); public override string ToString() { return $"Position: {Position.ToString()}, Rotation {Rotation.ToString()}, Scale {Scale.ToString()}"; } public TransformProperties(Transform t) : this(t.position, t.rotation, t.localScale) { } [Obsolete("Use ResetState.")] public void Reset() => ResetState(); public void ResetState() { Update(Vector3.zero, Quaternion.identity, Vector3.zero); IsValid = false; } public void Update(Transform t) { Update(t.position, t.rotation, t.localScale); } public void Update(TransformProperties tp) { Update(tp.Position, tp.Rotation, tp.Scale); } public void Update(Vector3 position, Quaternion rotation) { Update(position, rotation, Scale); } public void Update(Vector3 position, Quaternion rotation, Vector3 localScale) { Position = position; Rotation = rotation; Scale = localScale; IsValid = true; } /// /// Adds another transformProperties onto this. /// /// public void Add(TransformProperties tp) { Position += tp.Position; Rotation *= tp.Rotation; Scale += tp.Scale; } /// /// Subtracts another transformProperties from this. /// /// public void Subtract(TransformProperties tp) { Position -= tp.Position; Rotation *= Quaternion.Inverse(tp.Rotation); Scale -= tp.Scale; } /// /// Returns if this TransformProperties equals anothers values. /// public bool ValuesEquals(TransformProperties properties) { return (this.Position == properties.Position && this.Rotation == properties.Rotation && this.Scale == properties.Scale); } } }