private void Awake() { if (_instance == null) { _instance = this; } }
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(); } }