Exemple #1
0
        public override void Process()
        {
            if (handMRManager_ == null)
            {
                handMRManager_ = FindObjectOfType <HandMRManager>();
            }
            if (colliders_.Count <= 0)
            {
                addColliderToSelectable();
            }

            bool noHands = true;

            foreach (var hand in Hands)
            {
                if (hand.IsTrackingHand)
                {
                    noHands = false;
                    break;
                }
            }
            if (noHands)
            {
                if (Time.time - prevDetectTime_ > LeaveTime)
                {
                    Selectable[] selectables2 = Selectable.allSelectablesArray;
                    changeEnabledSelectable(true, selectables2);
                    base.Process();
                    reEnabledSelectable(selectables2);
                }
                return;
            }

            Transform         cameraTrans = handMRManager_.GetCameraTransform();
            List <RaycastHit> tempHits    = new List <RaycastHit>();

            bool handIsOpened = false;

            foreach (var hand in Hands)
            {
                if (!hand.IsTrackingHand)
                {
                    continue;
                }

                bool grabed = false;
                if (GrabDetect)
                {
#if false
                    grabed = true;
                    bool opened = true;
                    for (int loop = 1; loop < 5; loop++)
                    {
                        if (hand.GetFingerOpened(loop))
                        {
                            grabed = false;
                        }
                        else
                        {
                            opened = false;
                        }
                    }
                    if (Vector3.Distance(hand.GetFinger(4).position, hand.GetFinger(8).position) < 0.03f)
                    {
                        grabed = true;
                        opened = false;
                    }
                    if (opened)
                    {
                        handIsOpened = true;
                    }
#endif
                    grabed       = hand.IsGrab;
                    handIsOpened = !grabed;
                }

                Vector3 forward = (hand.GetFinger(8).position - cameraTrans.position).normalized;

                RaycastHit[] hits = Physics.RaycastAll(cameraTrans.position, forward,
                                                       Mathf.Infinity, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.Collide);

                if (hits != null && hits.Length > 0)
                {
                    float      nearDistance = float.PositiveInfinity;
                    GameObject nearObj      = null;
                    RaycastHit nearHit      = hits[0];
                    foreach (RaycastHit hit in hits)
                    {
                        if (hit.distance < nearDistance)
                        {
                            nearDistance = hit.distance;
                            nearObj      = hit.transform.gameObject;
                            nearHit      = hit;
                        }
                    }

                    float distance = Vector3.Distance(nearHit.point, hand.GetFinger(8).position);
                    if (grabed || (distance <= TouchDistance && TouchDistance > 0f))
                    {
                        uiDetectControl(nearObj, nearHit.point, grabed);
                        return;
                    }
                    else
                    {
                        tempHits.AddRange(hits);
                    }
                }
            }

            if (handIsOpened)
            {
                isGrabDetected_ = false;
            }

            if (tempHits.Count > 0)
            {
                float      nearDistance = float.PositiveInfinity;
                GameObject nearObj      = null;
                foreach (RaycastHit hit in tempHits)
                {
                    if (hit.distance < nearDistance)
                    {
                        nearDistance = hit.distance;
                        nearObj      = hit.transform.gameObject;
                    }
                }

                if (eventSystem.currentSelectedGameObject != nearObj)
                {
                    eventSystem.SetSelectedGameObject(nearObj);
                }
                return;
            }

            if (prevDetectObj_ != null && submitPointerData_ != null)
            {
                GameObject submitObj = ExecuteEvents.GetEventHandler <ISubmitHandler>(prevDetectObj_);
                if (submitObj != null)
                {
                    ExecuteEvents.Execute(submitObj, submitPointerData_, ExecuteEvents.submitHandler);
                    addColliderToSelectable();
                    prevDetectTime_ = Time.time;
                }
                submitPointerData_ = null;
            }

            if (Time.time - prevDetectTime_ > LeaveTime)
            {
                resetSelect();
                prevDetectObj_ = null;

                Selectable[] selectables = Selectable.allSelectablesArray;
                changeEnabledSelectable(true, selectables);
                base.Process();
                reEnabledSelectable(selectables);
            }
        }
Exemple #2
0
        void LateUpdate()
        {
            if (handMRManager_ == null)
            {
                return;
            }

            if (colorAlpha_ > 0f)
            {
                Transform cameraTrans = handMRManager_.GetCameraTransform();

                float zLength      = 0f;
                int   zLengthCount = 0;
                foreach (var hand in handMRManager_.Hands)
                {
                    var sHand = hand.GetComponent <HandVRSphereHand>();
                    if (sHand.IsTrackingHand)
                    {
                        zLength += cameraTrans.InverseTransformPoint(sHand.HandCenterPosition).z;
                        zLengthCount++;
                    }
                }
                if (zLengthCount <= 0)
                {
                    colorAlpha_ = 0f;
                }
                else
                {
                    if (!isSetThickness_)
                    {
                        renderer_.material.SetFloat("_ThicknessX",
                                                    renderer_.material.GetFloat("_ThicknessX") * handVRMain_.Height / handVRMain_.Width);
                        renderer_.material.SetFloat("_ThicknessInnerX",
                                                    renderer_.material.GetFloat("_ThicknessInnerX") * handVRMain_.Height / handVRMain_.Width);

                        isSetThickness_ = true;
                    }

                    zLength /= zLengthCount;

                    float height = Mathf.Tan(handVRMain_.FixedFieldOfView * Mathf.Deg2Rad * 0.5f) * zLength * Size;
                    float width  = height * handVRMain_.Width / handVRMain_.Height;
                    if (ParentForScale != null)
                    {
                        transform.localScale = new Vector3(width * ParentForScale.lossyScale.x, height * ParentForScale.lossyScale.y, 1f);
                    }
                    else
                    {
                        transform.localScale = new Vector3(width, height, 1f);
                    }

                    Vector3 localPos = new Vector3(handVRMain_.ShiftX, handVRMain_.ShiftY, zLength);
                    transform.position = cameraTrans.TransformPoint(localPos);
                    transform.rotation = cameraTrans.rotation;
                }
            }

            renderer_.material.SetColor("_Color",
                                        new Color(defaultColor_.r, defaultColor_.g, defaultColor_.b, defaultColor_.a * colorAlpha_));
            renderer_.material.SetColor("_ColorInner",
                                        new Color(defaultColorInner_.r, defaultColorInner_.g, defaultColorInner_.b, defaultColorInner_.a * colorAlpha_));
        }