Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
 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));
 }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
 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;
 }