#region License
#endregion
#region Using Statements
using
System;
#endregion
namespace
Microsoft.Xna.Framework
{
/// <summary>
/// Key point on the <see cref="Curve"/>.
/// </summary>
[Serializable]
public
class
CurveKey : IEquatable<CurveKey>, IComparable<CurveKey>
{
#region Public Properties
/// <summary>
/// Gets or sets the indicator whether the segment between this point and the next point on the curve is discrete or continuous.
/// </summary>
public
CurveContinuity Continuity
{
get
;
set
;
}
/// <summary>
/// Gets a position of the key on the curve.
/// </summary>
public
float
Position
{
get
;
private
set
;
}
/// <summary>
/// Gets or sets a tangent when approaching this point from the previous point on the curve.
/// </summary>
public
float
TangentIn
{
get
;
set
;
}
/// <summary>
/// Gets or sets a tangent when leaving this point to the next point on the curve.
/// </summary>
public
float
TangentOut
{
get
;
set
;
}
/// <summary>
/// Gets a value of this point.
/// </summary>
public
float
Value
{
get
;
set
;
}
#endregion
#region Public Constructors
/// <summary>
/// Creates a new instance of <see cref="CurveKey"/> class.
/// </summary>
/// <param name="position">Position on the curve.</param>
/// <param name="value">Value of the control point.</param>
public
CurveKey(
float
position,
float
value
) :
this
(
position,
value,
0,
0,
CurveContinuity.Smooth
) {
}
/// <summary>
/// Creates a new instance of <see cref="CurveKey"/> class.
/// </summary>
/// <param name="position">Position on the curve.</param>
/// <param name="value">Value of the control point.</param>
/// <param name="tangentIn">Tangent approaching point from the previous point on the curve.</param>
/// <param name="tangentOut">Tangent leaving point toward next point on the curve.</param>
public
CurveKey(
float
position,
float
value,
float
tangentIn,
float
tangentOut
) :
this
(
position,
value,
tangentIn,
tangentOut,
CurveContinuity.Smooth
) {
}
/// <summary>
/// Creates a new instance of <see cref="CurveKey"/> class.
/// </summary>
/// <param name="position">Position on the curve.</param>
/// <param name="value">Value of the control point.</param>
/// <param name="tangentIn">Tangent approaching point from the previous point on the curve.</param>
/// <param name="tangentOut">Tangent leaving point toward next point on the curve.</param>
/// <param name="continuity">Indicates whether the curve is discrete or continuous.</param>
public
CurveKey(
float
position,
float
value,
float
tangentIn,
float
tangentOut,
CurveContinuity continuity
) {
Position = position;
Value = value;
TangentIn = tangentIn;
TangentOut = tangentOut;
Continuity = continuity;
}
#endregion
#region Public Methods
/// <summary>
/// Creates a copy of this key.
/// </summary>
/// <returns>A copy of this key.</returns>
public
CurveKey Clone()
{
return
new
CurveKey(
Position,
Value,
TangentIn,
TangentOut,
Continuity
);
}
public
int
CompareTo(CurveKey other)
{
return
Position.CompareTo(other.Position);
}
public
bool
Equals(CurveKey other)
{
return
(
this
== other);
}
#endregion
#region Public Static Operators and Override Methods
/// <summary>
/// Compares whether two <see cref="CurveKey"/> instances are not equal.
/// </summary>
/// <param name="value1"><see cref="CurveKey"/> instance on the left of the not equal sign.</param>
/// <param name="value2"><see cref="CurveKey"/> instance on the right of the not equal sign.</param>
/// <returns><c>true</c> if the instances are not equal; <c>false</c> otherwise.</returns>
public
static
bool
operator
!=(CurveKey a, CurveKey b)
{
return
!(a == b);
}
/// <summary>
/// Compares whether two <see cref="CurveKey"/> instances are equal.
/// </summary>
/// <param name="value1"><see cref="CurveKey"/> instance on the left of the equal sign.</param>
/// <param name="value2"><see cref="CurveKey"/> instance on the right of the equal sign.</param>
/// <returns><c>true</c> if the instances are equal; <c>false</c> otherwise.</returns>
public
static
bool
operator
==(CurveKey a, CurveKey b)
{
if
(
object
.Equals(a,
null
))
{
return
object
.Equals(b,
null
);
}
if
(
object
.Equals(b,
null
))
{
return
object
.Equals(a,
null
);
}
return
( (a.Position == b.Position) &&
(a.Value == b.Value) &&
(a.TangentIn == b.TangentIn) &&
(a.TangentOut == b.TangentOut) &&
(a.Continuity == b.Continuity) );
}
public
override
bool
Equals(
object
obj)
{
return
(obj
as
CurveKey) ==
this
;
}
public
override
int
GetHashCode()
{
return
(
Position.GetHashCode() ^
Value.GetHashCode() ^
TangentIn.GetHashCode() ^
TangentOut.GetHashCode() ^
Continuity.GetHashCode()
);
}
#endregion
}
}