diff options
Diffstat (limited to 'Assets/ThirdParty/BezierCurves/Scripts/BezierPoint.cs')
-rw-r--r-- | Assets/ThirdParty/BezierCurves/Scripts/BezierPoint.cs | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/Assets/ThirdParty/BezierCurves/Scripts/BezierPoint.cs b/Assets/ThirdParty/BezierCurves/Scripts/BezierPoint.cs new file mode 100644 index 00000000..5abe769d --- /dev/null +++ b/Assets/ThirdParty/BezierCurves/Scripts/BezierPoint.cs @@ -0,0 +1,170 @@ +#region UsingStatements + +using UnityEngine; +using System; +using System.Collections; + +#endregion + +/// <summary> +/// - Helper class for storing and manipulating Bezier Point data +/// - Ensures that handles are in correct relation to one another +/// - Handles adding/removing self from curve point lists +/// - Calls SetDirty() on curve when edited +/// </summary> +[Serializable] +public class BezierPoint : MonoBehaviour{ + + #region PublicEnumerations + + /// <summary> + /// - Enumeration describing the relationship between a point's handles + /// - Connected : The point's handles are mirrored across the point + /// - Broken : Each handle moves independently of the other + /// - None : This point has no handles (both handles are located ON the point) + /// </summary> + public enum HandleStyle + { + Connected, + Broken, + None, + } + + #endregion + + #region PublicProperties + + /// <summary> + /// - Curve this point belongs to + /// - Changing this value will automatically remove this point from the current curve and add it to the new one + /// </summary> + [SerializeField] + private BezierCurve _curve; + public BezierCurve curve + { + get{return _curve;} + set + { + if(_curve) _curve.RemovePoint(this); + _curve = value; + _curve.AddPoint(this); + } + } + + /// <summary> + /// - Value describing the relationship between this point's handles + /// </summary> + public HandleStyle handleStyle; + + /// <summary> + /// - Shortcut to transform.position + /// </summary> + /// <value> + /// - The point's world position + /// </value> + public Vector3 position + { + get { return transform.position; } + set { transform.position = value; } + } + + /// <summary> + /// - Shortcut to transform.localPosition + /// </summary> + /// <value> + /// - The point's local position. + /// </value> + public Vector3 localPosition + { + get { return transform.localPosition; } + set { transform.localPosition = value; } + } + + /// <summary> + /// - Local position of the first handle + /// - Setting this value will cause the curve to become dirty + /// - This handle effects the curve generated from this point and the point proceeding it in curve.points + /// </summary> + [SerializeField] + private Vector3 _handle1; + public Vector3 handle1 + { + get { return _handle1; } + set + { + if(_handle1 == value) return; + _handle1 = value; + if(handleStyle == HandleStyle.None) handleStyle = HandleStyle.Broken; + else if(handleStyle == HandleStyle.Connected) _handle2 = -value; + _curve.SetDirty(); + } + } + + /// <summary> + /// - Global position of the first handle + /// - Ultimately stored in the 'handle1' variable + /// - Setting this value will cause the curve to become dirty + /// - This handle effects the curve generated from this point and the point proceeding it in curve.points + /// </summary> + public Vector3 globalHandle1 + { + get{return transform.TransformPoint(handle1);} + set{handle1 = transform.InverseTransformPoint(value);} + } + + /// <summary> + /// - Local position of the second handle + /// - Setting this value will cause the curve to become dirty + /// - This handle effects the curve generated from this point and the point coming after it in curve.points + /// </summary> + [SerializeField] + private Vector3 _handle2; + public Vector3 handle2 + { + get { return _handle2; } + set + { + if(_handle2 == value) return; + _handle2 = value; + if(handleStyle == HandleStyle.None) handleStyle = HandleStyle.Broken; + else if(handleStyle == HandleStyle.Connected) _handle1 = -value; + _curve.SetDirty(); + } + } + + /// <summary> + /// - Global position of the second handle + /// - Ultimately stored in the 'handle2' variable + /// - Setting this value will cause the curve to become dirty + /// - This handle effects the curve generated from this point and the point coming after it in curve.points + /// </summary> + public Vector3 globalHandle2 + { + get{return transform.TransformPoint(handle2);} + set{handle2 = transform.InverseTransformPoint(value);} + } + + #endregion + + #region PrivateVariables + + /// <summary> + /// - Used to determine if this point has moved since the last frame + /// </summary> + private Vector3 lastPosition; + + #endregion + + #region MonoBehaviourFunctions + + void Update() + { + if(!_curve.dirty && transform.position != lastPosition) + { + _curve.SetDirty(); + lastPosition = transform.position; + } + } + + #endregion +} |