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; } /** @} */ }