using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace BansheeEngine
{
/** @addtogroup Physics
* @{
*/
/// Represents a joint limit that contraints movement to within an elliptical cone.
[StructLayout(LayoutKind.Sequential), SerializeObject]
public partial struct LimitConeRange
{
/// Initializes the struct with default values.
public static LimitConeRange Default()
{
LimitConeRange value = new LimitConeRange();
value.yLimitAngle = new Radian();
value.zLimitAngle = new Radian();
value.contactDist = -1f;
value.restitution = 0f;
value.spring = new Spring();
return value;
}
///
/// Constructs a hard limit. Once the limit is reached the movement of the attached bodies will come to a stop.
///
///
/// Y angle of the cone. Movement is constrainted between 0 and this angle on the Y axis.
///
///
/// Z angle of the cone. Movement is constrainted between 0 and this angle on the Z axis.
///
///
/// Distance from the limit at which it becomes active. Allows the solver to activate earlier than the limit is reached
/// to avoid breaking the limit. Specify -1 for the default.
///
public LimitConeRange(Radian yLimitAngle, Radian zLimitAngle, float contactDist = -1f)
{
this.yLimitAngle = yLimitAngle;
this.zLimitAngle = zLimitAngle;
this.contactDist = -1f;
this.restitution = 0f;
this.spring = new Spring();
}
///
/// Constructs a soft limit. Once the limit is reached the bodies will bounce back according to the resitution parameter
/// and will be pulled back towards the limit by the provided spring.
///
///
/// Y angle of the cone. Movement is constrainted between 0 and this angle on the Y axis.
///
///
/// Z angle of the cone. Movement is constrainted between 0 and this angle on the Z axis.
///
///
/// Spring that controls how are the bodies pulled back towards the limit when they breach it.
///
///
/// Controls how do objects react when the limit is reached, values closer to zero specify non-ellastic collision, while
/// those closer to one specify more ellastic (i.e bouncy) collision. Must be in [0, 1] range.
///
public LimitConeRange(Radian yLimitAngle, Radian zLimitAngle, Spring spring, float restitution = 0f)
{
this.yLimitAngle = yLimitAngle;
this.zLimitAngle = zLimitAngle;
this.contactDist = -1f;
this.restitution = 0f;
this.spring = new Spring();
}
///
/// Returns a subset of this struct. This subset usually contains common fields shared with another struct.
///
public LimitCommon GetBase()
{
LimitCommon value;
value.contactDist = contactDist;
value.restitution = restitution;
value.spring = spring;
return value;
}
///
/// Assigns values to a subset of fields of this struct. This subset usually contains common field shared with
/// another struct.
///
public void SetBase(LimitCommon value)
{
contactDist = value.contactDist;
restitution = value.restitution;
spring = value.spring;
}
/// Y angle of the cone. Movement is constrainted between 0 and this angle on the Y axis.
public Radian yLimitAngle;
/// Z angle of the cone. Movement is constrainted between 0 and this angle on the Z axis.
public Radian zLimitAngle;
///
/// Distance from the limit at which it becomes active. Allows the solver to activate earlier than the limit is reached
/// to avoid breaking the limit.
///
public float contactDist;
///
/// Controls how do objects react when the limit is reached, values closer to zero specify non-ellastic collision, while
/// those closer to one specify more ellastic (i.e bouncy) collision. Must be in [0, 1] range.
///
public float restitution;
/// Spring that controls how are the bodies pulled back towards the limit when they breach it.
public Spring spring;
}
/** @} */
}