using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace BansheeEngine { /** @addtogroup Physics * @{ */ /// Represents a joint limit between two angles. [StructLayout(LayoutKind.Sequential), SerializeObject] public partial struct LimitAngularRange { /// Initializes the struct with default values. public static LimitAngularRange Default() { LimitAngularRange value = new LimitAngularRange(); value.lower = new Radian(); value.upper = 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. /// /// Lower angle of the limit. Must be less than . /// Upper angle of the limit. Must be more than . /// /// 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 LimitAngularRange(Radian lower, Radian upper, float contactDist = -1f) { this.lower = lower; this.upper = upper; 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. /// /// Lower angle of the limit. Must be less than . /// Upper angle of the limit. Must be more than . /// /// 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 LimitAngularRange(Radian lower, Radian upper, Spring spring, float restitution = 0f) { this.lower = lower; this.upper = upper; 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; } /// Lower angle of the limit. Must be less than #upper. public Radian lower; /// Upper angle of the limit. Must be less than #lower. public Radian upper; /// /// 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; } /** @} */ }