RoboticArms/Library/PackageCache/com.unity.splines@d3e1e500c9a0/Runtime/SplineInfo.cs
2025-11-17 15:16:36 +07:00

140 lines
4.7 KiB
C#

using System;
using Unity.Mathematics;
namespace UnityEngine.Splines
{
/// <summary>
/// SplineInfo is used to wrap a reference to the <see cref="SplineContainer"/> and index within that container to
/// describe a <see cref="Spline"/>.
/// </summary>
[Serializable]
public struct SplineInfo : IEquatable<SplineInfo>, ISerializationCallbackReceiver
{
[SerializeField]
Object m_Object;
[SerializeReference]
ISplineContainer m_Container;
[SerializeField]
int m_SplineIndex;
/// <summary>
/// If the referenced <see cref="ISplineContainer"/> is a UnityEngine.Object this field contains that object.
/// </summary>
public Object Object => m_Object;
/// <summary>
/// The <see cref="ISplineContainer"/> that contains the spline.
/// </summary>
public ISplineContainer Container
{
get => m_Container ?? m_Object as ISplineContainer;
set => m_Container = value;
}
/// <summary>
/// The associated <see cref="UnityEngine.Transform"/> of the target. This may be null if the container is not
/// a MonoBehaviour.
/// </summary>
public Transform Transform => Object is Component component ? component.transform : null;
/// <summary>
/// A reference to the <see cref="UnityEngine.Splines.Spline"/>. This may be null if the container or index are
/// invalid.
/// </summary>
public Spline Spline => Container != null && Index > -1 && Index < Container.Splines.Count
? Container.Splines[Index]
: null;
/// <summary>
/// The index of the spline in the enumerable returned by the <see cref="ISplineContainer"/>.
/// </summary>
public int Index
{
get => m_SplineIndex;
set => m_SplineIndex = value;
}
/// <summary>
/// Matrix that transforms the <see cref="Object"/> from local space into world space.
/// </summary>
public float4x4 LocalToWorld => Transform != null ? (float4x4)Transform.localToWorldMatrix : float4x4.identity;
/// <summary>
/// Create a new <see cref="SplineInfo"/> object.
/// </summary>
/// <param name="container">The <see cref="ISplineContainer"/> that contains the spline.</param>
/// <param name="index">The index of the spline in the enumerable returned by the <see cref="ISplineContainer"/>.</param>
public SplineInfo(ISplineContainer container, int index)
{
m_Container = container;
m_Object = container as Object;
m_SplineIndex = index;
}
/// <summary>
/// Compare against another <see cref="SplineInfo"/> for equality.
/// </summary>
/// <param name="other">The other instance to compare against.</param>
/// <returns>
/// Returns true when <paramref name="other"/> is a <see cref="SplineInfo"/> and the values of each instance are
/// identical.
/// </returns>
public bool Equals(SplineInfo other)
{
return Equals(Container, other.Container) && Index == other.Index;
}
/// <summary>
/// Compare against an object for equality.
/// </summary>
/// <param name="obj">The object to compare against.</param>
/// <returns>
/// Returns true when <paramref name="obj"/> is a <see cref="SplineInfo"/> and the values of each instance are
/// identical.
/// </returns>
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
return obj is SplineInfo other && Equals(other);
}
/// <summary>
/// Calculate a hash code for this info.
/// </summary>
/// <returns>
/// A hash code for the <see cref="SplineInfo"/>.
/// </returns>
public override int GetHashCode()
{
unchecked
{
var hashCode = (Container != null ? Container.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ Index;
return hashCode;
}
}
/// <summary>
/// Called before this object is serialized by the Editor.
/// </summary>
public void OnBeforeSerialize()
{
if (m_Container is Object obj)
{
m_Object = obj;
m_Container = null;
}
}
/// <summary>
/// Called after this object is deserialized by the Editor.
/// </summary>
public void OnAfterDeserialize()
{
m_Container ??= m_Object as ISplineContainer;
}
}
}