private void Awake()
 {
     if (_instance == null)
     {
         _instance = this;
     }
 }
Esempio n. 2
0
        void Update()
        {
            // Drawing Conditionals //

            if (_paintCursor.IsTracked)
            {
                _handLifetime += Time.deltaTime;
            }
            else
            {
                _handLifetime = 0F;
            }

            _inDangerZone = false;
            // old shitty danger zone system
            {
                //for (int i = 0; i < _wearableManager._wearableUIs.Length; i++) {
                //  WearableUI marble = _wearableManager._wearableUIs[i];
                //  float distance = Vector3.Distance(_paintCursor.transform.position, marble.transform.position);
                //  if (!marble._isAttached) {
                //    _inDangerZone |= distance < marble.GetWorkstationDangerZoneRadius();
                //  }
                //  else {
                //    _inDangerZone |= marble.IsDisplaying && distance < marble.GetAnchoredDangerZoneRadius();
                //  }
                //}
            }
            // slightly better system
            Collider noPaintZoneCollider = null;
            {
                var   cursorPos = _paintCursor.transform.position;
                float closestColliderSqrDist = float.PositiveInfinity;
                foreach (var collider in NoPaintZone.noPaintColliders)
                {
                    var doesCollide = collider.ClosestPoint(cursorPos).ApproxEquals(cursorPos);
                    if (doesCollide)
                    {
                        var testSqrDist = (collider.transform.position - cursorPos).sqrMagnitude;
                        if (testSqrDist < closestColliderSqrDist)
                        {
                            noPaintZoneCollider    = collider;
                            closestColliderSqrDist = testSqrDist;
                        }
                        _inDangerZone = true;
                    }
                }
            }

            bool isUIDisplayingOnThisHand = false;

            for (int i = 0; i < _wearableManager._wearableAnchors.Length && i < 1; i++)
            {
                isUIDisplayingOnThisHand |= _paintCursor.Handedness == _wearableManager._wearableAnchors[i]._chirality && _wearableManager._wearableAnchors[i].IsDisplaying;
            }

            bool isLoading = _ribbonIO.IsLoading;

            bool  possibleToActualize = false;
            bool  possibleToActualizeButForDangerZone = false;
            Color drawColor = _paintCursor.Color;

            if (drawColor.a > 0.99F &&
                !interactionHand.isGraspingObject &&
                !isUIDisplayingOnThisHand &&
                _handLifetime > MIN_HAND_DRAWING_LIFETIME &&
                !isLoading
                )
            {
                if (_inDangerZone)
                {
                    possibleToActualizeButForDangerZone = true;
                    possibleToActualize = false;
                }
                else
                {
                    possibleToActualize = true;
                }
            }
            _paintCursor.NotifyPossibleToActualize(possibleToActualize);

            // Possible to begin actualizing -- if actualization already happening, this state doesn't matter

            // Currently ignored.
            //float fistStrength = 0F;
            //if (_paintCursor._handModel != null && _paintCursor._handModel.GetLeapHand() != null) {
            //  _hand = _paintCursor._handModel.GetLeapHand();
            //  //Debug.Log(Vector3.Dot(_hand.Fingers[1].Direction.ToVector3(), _hand.Direction.ToVector3())); tracking isn't accurate enough to just use index curl.
            //  fistStrength =
            //    Vector3.Dot(_hand.Fingers[2].Direction.ToVector3(), _hand.Direction.ToVector3()) +
            //    Vector3.Dot(_hand.Fingers[3].Direction.ToVector3(), _hand.Direction.ToVector3()) +
            //    Vector3.Dot(_hand.Fingers[4].Direction.ToVector3(), _hand.Direction.ToVector3());
            //}

            float angleFromCameraLookVector = Vector3.Angle(Camera.main.transform.forward, _paintCursor.transform.position - Camera.main.transform.position);
            float acceptableFOVAngle        = 50F;
            bool  withinAcceptableCameraFOV = angleFromCameraLookVector < acceptableFOVAngle;

            bool possibleToBeginActualizing = false;

            if (//fistStrength > -2f
                withinAcceptableCameraFOV)
            {
                possibleToBeginActualizing = true;
            }
            _paintCursor.NotifyPossibleToBeginActualizing(possibleToBeginActualizing);

            // Drawing State //

            if (_paintCursor.IsTracked && !_strokeProcessor.IsBufferingStroke && possibleToBeginActualizing)
            {
                if (possibleToActualize)
                {
                    BeginStroke();
                }
                else if (possibleToActualizeButForDangerZone)
                {
                }
            }

            if (_paintCursor.DidStartPinch && possibleToBeginActualizing && !_strokeProcessor.IsActualizingStroke)
            {
                if (possibleToActualize)
                {
                    StartActualizingStroke();
                    _paintCursor.NotifyIsPainting(true);
                }
                else if (possibleToActualizeButForDangerZone)
                {
                    NoPaintZoneFeedbackDrawer.DrawFailedPaintGizmo(_paintCursor.transform.position,
                                                                   noPaintZoneCollider);
                }
            }

            if (_paintCursor.IsTracked && _strokeProcessor.IsBufferingStroke)
            {
                UpdateStroke();
            }

            if ((!_paintCursor.IsTracked || !_paintCursor.IsPinching) && _strokeProcessor.IsActualizingStroke)
            {
                StopActualizingStroke();
                _paintCursor.NotifyIsPainting(false);
            }

            if ((!_paintCursor.IsTracked || (!_strokeProcessor.IsActualizingStroke && !possibleToBeginActualizing)) && _strokeProcessor.IsBufferingStroke)
            {
                EndStroke();
            }
        }