/// <summary> /// return the closest point on the disc from K, if the GravityInfo permit it /// </summary> /// <param name="k"></param> /// <param name="canApplyGravity"></param> /// <param name="gravityDisc"></param> /// <returns></returns> public bool GetClosestPointOnDiscIfWeCan(Vector3 k, GravityOverrideDisc gravityDisc, out Vector3 closestPoint) { closestPoint = Vector3.zero; if (!gravityDisc.CanApplyGravity || (!AllowBottom && !_plane.IsAbove(k))) { return(false); } //project point to a plane Vector3 kProjected = ExtPlane.ProjectPointInPlane(_plane, k); //if dist² < radius², this projected point is inside the circle float distSquared = (kProjected - _plane.Point).sqrMagnitude; bool isInsideShape = distSquared < _radiusSquared; if (isInsideShape) { if (!gravityDisc.Face) { return(false); } closestPoint = kProjected; return(true); } if (!gravityDisc.Borders) { return(false); } //return the closest point on the circle (extremity of the disc) closestPoint = _plane.Point + (kProjected - _plane.Point).FastNormalized() * _radius; return(true); }
public bool GetClosestPointIfWeCan(Vector3 k, GravityOverrideDisc gravityOverride, out Vector3 closestPoint) { closestPoint = Vector3.zero; if (!gravityOverride.CanApplyGravity) { return(false); } return(_circle.GetClosestPointOnDiscIfWeCan(k, gravityOverride, out closestPoint)); }
/// <summary> /// draw a disc /// </summary> public static GravityOverrideDisc DrawDisc(ExtCircle circle, GravityOverrideDisc discGravity, Color color, bool allowBottom, out bool hasChanged) { hasChanged = false; Quaternion rotation = ExtRotation.QuaternionFromVectorDirector(circle.Normal, Vector3.up); bool topFace = discGravity.Face; bool topExtremity = discGravity.Borders; bool isCameraViewBehindFace = Vector3.Dot(ExtSceneView.GetSceneViewCameraTransform().forward, circle.Normal) > 0 && !allowBottom; Handles.color = color; if (!Event.current.alt && Event.current.button != 2 && Handles.Button(circle.Point, rotation, circle.Radius, circle.Radius, Handles.CircleHandleCap)) { Debug.Log("extremity pressed"); discGravity.Borders = !discGravity.Borders; hasChanged = true; Use(); } if (!topFace) { Handles.color = (isCameraViewBehindFace) ? new Color(color.r, color.g, color.b, color.a / 2) : color; Handles.DrawSolidDisc(circle.Point, circle.Normal, circle.Radius / 10 * 8); } if (!topExtremity) { Handles.color = (isCameraViewBehindFace) ? new Color(color.r, color.g, color.b, color.a / 2) : color; ExtHandle.DrawCircleThickness(circle, 50, ExtHandle.DrawOutlineType.INSIDE); } Handles.color = Color.red; if (!Event.current.alt && Event.current.button != 2 && Handles.Button(circle.Point, rotation, circle.Radius / 10 * 7, circle.Radius / 10 * 7, Handles.CircleHandleCap)) { if (isCameraViewBehindFace) { Debug.Log("not behind face"); } else { Debug.Log("Face pressed !"); discGravity.Face = !discGravity.Face; hasChanged = true; Use(); } } return(discGravity); }
public static void ApplyModificationToDisc(SerializedProperty disc1, GravityOverrideDisc datas) { disc1.GetPropertie(nameof(datas.Face)).boolValue = datas.Face; disc1.GetPropertie(nameof(datas.Borders)).boolValue = datas.Borders; disc1.GetPropertie("_canApplyGravity").boolValue = datas.CanApplyGravity; }