Exemple #1
0
    private void ResolveClassicPinchOrGrab()
    {
        float pinchStrength = SingleHandManager.Instance.CurrentHand.PinchStrength;
        float grabStrength  = SingleHandManager.Instance.CurrentHand.GrabStrength;

        if (grabbing)
        {
            bool classicPinching = (pinchStrength >= unpinchThreshold);
            bool classicGrabbing = (grabStrength >= ungrabThreshold);
            grabbing = classicPinching | classicGrabbing;
        }
        else
        {
            bool classicPinching = (pinchStrength >= pinchThreshold);
            bool classicGrabbing = (grabStrength >= grabThreshold);
            grabbing = classicPinching | classicGrabbing;
        }

        if (grabbing)
        {
            GeneralisedGrabStrength = 1;
        }
        else
        {
            float normalisedPinchStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(pinchStrength, 0, pinchThreshold), 0, pinchThreshold, 0, 1);
            float normalisedGrabStrength  = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(grabStrength, 0, grabThreshold), 0, grabThreshold, 0, 1);

            GeneralisedGrabStrength = Mathf.Max(normalisedPinchStrength, normalisedGrabStrength);
        }
    }
Exemple #2
0
    private void OnDrawGizmos()
    {
        if (Application.isEditor && Application.isPlaying && DrawDebugGizmos)
        {
            float arcAngle = left ? ArcAngleLeft : ArcAngleRight;
            float circleCentreOffsetBase    = cursorDotSize * CircleCentreOffsetBaseScale * _screenScale;
            float arcMidpointRadius         = cursorDotSize * ArcMidpointOffsetScale * _screenScale;
            float currentCircleOffsetRadius = ScreenControlUtility.MapRangeToRange(radiusScale.Evaluate(generalisedGrabDetector.GeneralisedGrabStrength), 1, 0, arcMidpointRadius / 2, circleCentreOffsetBase);
            float finalOffsetRadius         = arcMidpointRadius / 2;

            Vector2 anchoredPosition = Camera.main.ScreenToWorldPoint(_targetPos);

            Vector2 arcOffset = new Vector2()
            {
                x = arcMidpointRadius * Mathf.Cos(Mathf.Deg2Rad * arcAngle),
                y = arcMidpointRadius * Mathf.Sin(Mathf.Deg2Rad * arcAngle)
            };

            Vector2 currentCircleOffset = new Vector2()
            {
                x = currentCircleOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (arcAngle + 180)),
                y = currentCircleOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (arcAngle + 180))
            };

            Vector2 finalOffset = new Vector2()
            {
                x = finalOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (arcAngle + 180)),
                y = finalOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (arcAngle + 180))
            };

            Vector3 arcMidpoint = new Vector3()
            {
                x = anchoredPosition.x + arcOffset.x,
                y = anchoredPosition.y + arcOffset.y,
                z = transform.position.z,
            };

            Vector3 circleCentre = new Vector3()
            {
                x = arcMidpoint.x + currentCircleOffset.x,
                y = arcMidpoint.y + currentCircleOffset.y,
                z = arcMidpoint.z,
            };

            Vector3 finalCircleCentre = new Vector3()
            {
                x = arcMidpoint.x + finalOffset.x,
                y = arcMidpoint.y + finalOffset.y,
                z = arcMidpoint.z,
            };

            Gizmos.color = Color.red;
            Gizmos.DrawWireSphere(circleCentre, currentCircleOffsetRadius);
            Gizmos.color = Color.blue;
            Gizmos.DrawWireSphere(finalCircleCentre, finalOffsetRadius);
            Gizmos.color = Color.green;
            Gizmos.DrawWireSphere(Camera.main.ScreenToWorldPoint(_targetPos), 0.1f);
        }
    }
    private bool ShouldTriggerGrab(Leap.Hand hand)
    {
        float handAngle        = GetAngle(hand);
        float clampedHandAngle = Mathf.Clamp(handAngle, clickAngle, 180);

        GrabStrength = ScreenControlUtility.MapRangeToRange(clampedHandAngle, clickAngle, 180, 1, 0);

        return(handAngle < clickAngle);
    }
Exemple #4
0
    private void ResolveClassicGrab()
    {
        float grabStrength = SingleHandManager.Instance.CurrentHand.GrabStrength;

        if (grabbing)
        {
            grabbing = (grabStrength >= ungrabThreshold);
            GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(grabStrength, 0, ungrabThreshold), 0, ungrabThreshold, 0, 1);
        }
        else
        {
            grabbing = (grabStrength >= grabThreshold);
            GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(grabStrength, 0, grabThreshold), 0, grabThreshold, 0, 1);
        }
    }
    public IEnumerator ShrinkCursorDot()
    {
        YieldInstruction yieldInstruction = new YieldInstruction();
        float            elapsedTime      = 0.0f;

        while (elapsedTime < pulseSeconds)
        {
            yield return(yieldInstruction);

            elapsedTime += Time.deltaTime;
            float scale = ScreenControlUtility.MapRangeToRange(pulseShrinkCurve.Evaluate(elapsedTime / pulseSeconds), 0, 1, cursorDownScale * cursorDotSize, cursorDotSize);
            SetCursorLocalScale(scale);
        }

        SetCursorLocalScale(cursorDownScale * cursorDotSize);
        cursorScalingRoutine = null;
    }
Exemple #6
0
    private IEnumerator ShrinkLine()
    {
        lineShrunk = true;
        YieldInstruction yieldInstruction = new YieldInstruction();
        float            elapsedTime      = 0.0f;

        while (elapsedTime < LineGrowthSeconds)
        {
            yield return(yieldInstruction);

            elapsedTime += Time.deltaTime;
            float scale = ScreenControlUtility.MapRangeToRange(lineShrinkCurve.Evaluate(elapsedTime / LineGrowthSeconds), 0, 1, 1, LineGrowthMultiplier);
            SetLineRendererWidthScale(scale);
        }

        SetLineRendererWidthScale(1);
        lineScalingRoutine = null;
    }
Exemple #7
0
    private void ResolveCombinedPinchAndGrab()
    {
        float pinchStrength    = SingleHandManager.Instance.CurrentHand.PinchStrength;
        float fistStrength     = SingleHandManager.Instance.CurrentHand.GetFistStrength();
        float combinedStrength = pinchStrength + fistStrength;

        if (grabbing)
        {
            grabbing = combinedStrength >= combinedUngrabThreshold;
            GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(combinedStrength, 0, combinedUngrabThreshold), 0, combinedUngrabThreshold, 0, 1);
        }
        else
        {
            grabbing = (pinchStrength == pinchThreshold) && (combinedStrength >= combinedGrabThreshold);
            float clampedCombinedStrength = Mathf.Clamp(combinedStrength, 0, combinedGrabThreshold);

            GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(clampedCombinedStrength + pinchStrength, 0, combinedGrabThreshold + pinchThreshold), 0, clampedCombinedStrength + pinchThreshold, 0, 1);
        }
    }
Exemple #8
0
    private void Update()
    {
        // side-on view
        float sideLeapPosX = ScreenControlUtility.MapRangeToRange(-PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.z, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, sideonScreen.sizeDelta.y);
        float sideLeapPosY = ScreenControlUtility.MapRangeToRange(PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.y, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, sideonScreen.sizeDelta.y);

        sideonScreen.localRotation = Quaternion.Euler(0, 0, PhysicalConfigurable.Config.ScreenRotationD);

        sideonLeap.localPosition = sideonScreen.localPosition + new Vector3(sideLeapPosX, sideLeapPosY, 0);
        sideonLeap.localRotation = Quaternion.Euler(PhysicalConfigurable.Config.LeapRotationD.z, 0, PhysicalConfigurable.Config.LeapRotationD.x);

        sideonLeap.localPosition = new Vector3(Mathf.Clamp(sideonLeap.localPosition.x, sideonLocalClampMin.x, sideonLocalClampMax.x),
                                               Mathf.Clamp(sideonLeap.localPosition.y, sideonLocalClampMin.y, sideonLocalClampMax.y), 0);

        // front-on view
        var aspectRatio = (float)GlobalSettings.ScreenWidth / (float)GlobalSettings.ScreenHeight;

        if (aspectRatio > 1)
        {
            // landscape
            frontonScreen.sizeDelta = new Vector2(dynamicScreenSizePX, dynamicScreenSizePX * ((float)GlobalSettings.ScreenHeight / (float)GlobalSettings.ScreenWidth));
        }
        else
        {
            //portrait
            frontonScreen.sizeDelta = new Vector2(dynamicScreenSizePX * aspectRatio, dynamicScreenSizePX);
        }

        float frontLeapPosX = ScreenControlUtility.MapRangeToRange(PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.x, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, frontonScreen.sizeDelta.y);
        float frontLeapPosY = ScreenControlUtility.MapRangeToRange(PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.y, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, frontonScreen.sizeDelta.y);

        frontonLeap.localPosition = frontonScreen.localPosition + new Vector3(frontLeapPosX, (-frontonScreen.sizeDelta.y / 2) + frontLeapPosY, 0);
        frontonLeap.localRotation = Quaternion.Euler(0, 0, PhysicalConfigurable.Config.LeapRotationD.z);

        frontonLeap.localPosition = new Vector3(Mathf.Clamp(frontonLeap.localPosition.x, frontonLocalClampMin.x, frontonLocalClampMax.x),
                                                Mathf.Clamp(frontonLeap.localPosition.y, frontonLocalClampMin.y, frontonLocalClampMax.y), 0);
    }
Exemple #9
0
    List <Vector3> GenerateArcPositions(float _arcLengthPercentage, float _arcAngle)
    {
        if (generalisedGrabDetector == null)
        {
            // try to re-find it!
            generalisedGrabDetector = FindObjectOfType <GeneralisedGrabDetector>();

            if (generalisedGrabDetector == null)
            {
                return(new List <Vector3>());
            }
        }

        float circleCentreOffsetBase    = cursorDotSize * CircleCentreOffsetBaseScale * _screenScale;
        float arcMidpointRadius         = cursorDotSize * ArcMidpointOffsetScale * _screenScale;
        float currentCircleOffsetRadius = ScreenControlUtility.MapRangeToRange(radiusScale.Evaluate(generalisedGrabDetector.GeneralisedGrabStrength), 1, 0, arcMidpointRadius / 2, circleCentreOffsetBase);

        Vector2 anchoredPosition = Camera.main.ScreenToWorldPoint(cursorTransform.anchoredPosition);

        Vector2 arcOffset = new Vector2()
        {
            x = arcMidpointRadius * Mathf.Cos(Mathf.Deg2Rad * _arcAngle),
            y = arcMidpointRadius * Mathf.Sin(Mathf.Deg2Rad * _arcAngle)
        };

        Vector2 currentCircleOffset = new Vector2()
        {
            x = currentCircleOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (_arcAngle + 180)),
            y = currentCircleOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (_arcAngle + 180))
        };

        Vector3 arcMidpoint = new Vector3()
        {
            x = anchoredPosition.x + arcOffset.x,
            y = anchoredPosition.y + arcOffset.y,
            z = transform.position.z,
        };

        Vector3 circleCentre = new Vector3()
        {
            x = arcMidpoint.x + currentCircleOffset.x,
            y = arcMidpoint.y + currentCircleOffset.y,
            z = arcMidpoint.z,
        };

        float finalOffsetRadius = arcMidpointRadius / 2;
        float arcLength         = (float)(2 * Math.PI * finalOffsetRadius) * _arcLengthPercentage;

        Vector2 delta         = (circleCentre - arcMidpoint);
        float   thetaMidpoint = (Mathf.Deg2Rad * 180) + Mathf.Atan2(delta.y, delta.x);

        float thetaMin = thetaMidpoint - ((arcLength / 2) / currentCircleOffsetRadius);
        float thetaMax = thetaMidpoint + ((arcLength / 2) / currentCircleOffsetRadius);

        List <Vector3> positions = new List <Vector3>();

        for (int i = 0; i < LineRendererPositions; i++)
        {
            float currentTheta = thetaMin + (i * (thetaMax - thetaMin) / LineRendererPositions);
            positions.Add(new Vector3()
            {
                x = circleCentre.x + Mathf.Cos(currentTheta) * currentCircleOffsetRadius,
                y = circleCentre.y + Mathf.Sin(currentTheta) * currentCircleOffsetRadius,
                z = circleCentre.z
            });
        }
        return(positions);
    }