Example #1
0
        void localMotion(EasyInputVR.Core.Motion motion)
        {
            if (laserPointer == null || !this.gameObject.activeInHierarchy)
            {
                return;
            }

            offsetPosition    = motion.currentPos;
            offsetPosition.y += heightOffset;

            if (laserPointer.transform.parent == null)
            {
                laserPointer.transform.localPosition = initialPosition + offsetPosition;
            }
            else
            {
                laserPointer.transform.localPosition = offsetPosition;
            }


            laserPointer.transform.localRotation = motion.currentOrientation;

            if (motion.currentPos != Vector3.zero)
            {
                line.enabled = true;
            }
            else
            {
                line.enabled = false;
                return;
            }

            end = EasyInputConstants.NOT_VALID;

            //set the number of positions like we aren't going to hit anything
#if UNITY_5_3 || UNITY_5_4
            line.SetVertexCount(segmentsCount);
#endif
#if UNITY_5_5
            line.numPositions = segmentsCount;
#endif
#if !(UNITY_5_3 || UNITY_5_4 || UNITY_5_5)
            line.positionCount = segmentsCount;
#endif

            //origin
            line.SetPosition(0, laserPointer.transform.position);
            previous.transform.position = laserPointer.transform.position;
            previous.transform.forward  = laserPointer.transform.forward;

            for (int i = 1; i < segmentsCount; i++)
            {
                //first set the position like it didn't hit anything
                line.SetPosition(i, (previous.transform.position + previous.transform.forward * segmentLength));

                //now do the raycast
                if (colliderRaycast && Physics.Raycast(previous.transform.position, previous.transform.forward, out rayHit, segmentLength, layersToCheck))
                {
                    end = rayHit.point;
                    line.SetPosition(i, end);

                    //we hit something so adjust the number of positions
#if UNITY_5_3 || UNITY_5_4
                    line.SetVertexCount(i + 1);
#endif
#if UNITY_5_5
                    line.numPositions = i + 1;
#endif
#if !(UNITY_5_3 || UNITY_5_4 || UNITY_5_5)
                    line.positionCount = i + 1;
#endif

                    if (rayHit.transform != null && rayHit.transform.gameObject != null)
                    {
                        if (lastHitGameObject == null)
                        {
                            //we weren't hitting anything before and now we are
                            EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, false);
                        }
                        else if (lastHitGameObject == rayHit.transform.gameObject)
                        {
                            //we are hitting the same object as last frame
                            EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, false, false);
                        }
                        else if (lastHitGameObject != rayHit.transform.gameObject)
                        {
                            //we are hitting a different object than last frame
                            EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, true);
                        }

                        lastHitGameObject = rayHit.transform.gameObject;
                        lastRayHit        = rayHit.point;
                    }

                    //break out of the loop since we hit something
                    break;
                }

                previous.transform.position = previous.transform.position + previous.transform.forward * segmentLength;
                previous.transform.rotation = Quaternion.AngleAxis(segmentCurveDegrees, previous.transform.right) * previous.transform.rotation;
            }

            //hit something
            if (end != EasyInputConstants.NOT_VALID)
            {
                if (reticle != null)
                {
                    reticle.SetActive(true);
                    reticle.transform.position   = end;
                    reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((end - laserPointer.transform.position).magnitude / reticleDistance));
                }
            }
            else
            {
                //didn't hit anything
                if (colliderRaycast)
                {
                    //raycast enabled but didn't hit anything
                    if (lastHitGameObject != null)
                    {
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, false, false, true);
                        lastHitGameObject = null;
                        lastRayHit        = EasyInputConstants.NOT_VALID;
                    }
                }

                if (reticle != null)
                {
                    reticle.SetActive(false);
                    reticle.transform.position   = previous.transform.position;
                    reticle.transform.localScale = initialReticleSize;
                }
            }

            if (reticle != null)
            {
                reticle.GetComponent <MeshRenderer>().material.color = reticleColor;
            }

            //UI based interactions
            if (UIRaycast && InputModule != null && (motion.currentPos != Vector3.zero))
            {
                InputModule.setUIRay(laserPointer.transform.position, laserPointer.transform.rotation, reticleDistance);
                uiHitPosition = InputModule.getuiHitPosition();
                if (uiHitPosition != EasyInputConstants.NOT_VALID && (end == EasyInputConstants.NOT_VALID || (end - laserPointer.transform.position).magnitude > (uiHitPosition - laserPointer.transform.position).magnitude))
                {
                    reticle.SetActive(false);
                    if ((uiHitPosition - laserPointer.transform.position).magnitude < reticleDistance)
                    {
                        reticle.transform.position   = uiHitPosition;
                        reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((uiHitPosition - laserPointer.transform.position).magnitude / reticleDistance));
                    }
                }
            }
        }
Example #2
0
        void localMotion(EasyInputVR.Core.Motion motion)
        {
            if (laserPointer == null || !this.gameObject.activeInHierarchy)
            {
                return;
            }

            if (reticle != null)
            {
                reticle.SetActive(true);
            }


            offsetPosition    = motion.currentPos;
            offsetPosition.y += heightOffset;

            if (laserPointer.transform.parent == null)
            {
                laserPointer.transform.localPosition = initialPosition + offsetPosition;
            }
            else
            {
                laserPointer.transform.localPosition = offsetPosition;
            }


            laserPointer.transform.localRotation = motion.currentOrientation;

            if (motion.currentPos != Vector3.zero)
            {
                line.enabled = true;
            }
            else
            {
                //not valid so disable and don't bother with the raycast so return
                line.enabled = false;
                return;
            }

            end = EasyInputConstants.NOT_VALID;

            //origin
            line.SetPosition(0, laserPointer.transform.position);


            if (colliderRaycast && Physics.Raycast(laserPointer.transform.position, laserPointer.transform.forward, out rayHit, reticleDistance, layersToCheck))
            {
                end = rayHit.point;
                if (rayHit.transform != null && rayHit.transform.gameObject != null)
                {
                    if (lastHitGameObject == null)
                    {
                        //we weren't hitting anything before and now we are
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, false);
                    }
                    else if (lastHitGameObject == rayHit.transform.gameObject)
                    {
                        //we are hitting the same object as last frame
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, false, false);
                    }
                    else if (lastHitGameObject != rayHit.transform.gameObject)
                    {
                        //we are hitting a different object than last frame
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, true);
                    }

                    lastHitGameObject = rayHit.transform.gameObject;
                    lastRayHit        = rayHit.point;
                }
            }

            //endpoint
            //line.SetPosition(1, end);

            if (end != EasyInputConstants.NOT_VALID)
            {
                if (reticle != null)
                {
                    reticle.transform.position   = end;
                    reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((end - laserPointer.transform.position).magnitude / reticleDistance));
                }

                if ((end - laserPointer.transform.position).magnitude < laserDistance)
                {
                    line.SetPosition(1, end);
                }
                else
                {
                    line.SetPosition(1, laserPointer.transform.position + laserPointer.transform.forward * laserDistance);
                }
            }
            else
            {
                //didn't hit anything
                if (colliderRaycast)
                {
                    //raycast enabled but didn't hit anything
                    if (lastHitGameObject != null)
                    {
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, false, false, true);
                        lastHitGameObject = null;
                        lastRayHit        = EasyInputConstants.NOT_VALID;
                    }
                }

                if (reticle != null)
                {
                    reticle.transform.position   = laserPointer.transform.position + laserPointer.transform.forward * reticleDistance;
                    reticle.transform.localScale = initialReticleSize;
                }


                line.SetPosition(1, laserPointer.transform.position + laserPointer.transform.forward * laserDistance);
            }

            if (reticle != null)
            {
                reticle.GetComponent <MeshRenderer>().material.color = reticleColor;
            }

            //UI based interactions
            if (UIRaycast && InputModule != null && (motion.currentPos != Vector3.zero))
            {
                InputModule.setUIRay(laserPointer.transform.position, laserPointer.transform.rotation, reticleDistance);
                uiHitPosition = InputModule.getuiHitPosition();
                if (uiHitPosition != EasyInputConstants.NOT_VALID && (end == EasyInputConstants.NOT_VALID || (end - laserPointer.transform.position).magnitude > (uiHitPosition - laserPointer.transform.position).magnitude))
                {
                    if ((uiHitPosition - laserPointer.transform.position).magnitude < reticleDistance)
                    {
                        reticle.transform.position   = uiHitPosition;
                        reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((uiHitPosition - laserPointer.transform.position).magnitude / reticleDistance));
                    }
                }
            }
        }
Example #3
0
        void Update()
        {
            if (reticle != null)
            {
                reticle.SetActive(true);
            }

            end = EasyInputConstants.NOT_VALID;

            if (colliderRaycast && Physics.Raycast(hmd.transform.position, hmd.transform.forward, out rayHit, reticleDistance, layersToCheck))
            {
                end = rayHit.point;
                if (rayHit.transform != null && rayHit.transform.gameObject != null)
                {
                    if (lastHitGameObject == null)
                    {
                        //we weren't hitting anything before and now we are
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, false);
                    }
                    else if (lastHitGameObject == rayHit.transform.gameObject)
                    {
                        //we are hitting the same object as last frame
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, false, false);
                    }
                    else if (lastHitGameObject != rayHit.transform.gameObject)
                    {
                        //we are hitting a different object than last frame
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, true);
                    }

                    lastHitGameObject = rayHit.transform.gameObject;
                    lastRayHit        = rayHit.point;
                }
            }

            if (end != EasyInputConstants.NOT_VALID)
            {
                if (reticle != null)
                {
                    reticle.transform.position   = end;
                    reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((end - hmd.transform.position).magnitude / reticleDistance));
                }
            }
            else
            {
                //didn't hit anything
                if (colliderRaycast)
                {
                    //raycast enabled but didn't hit anything
                    if (lastHitGameObject != null)
                    {
                        EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, false, false, true);
                        lastHitGameObject = null;
                        lastRayHit        = EasyInputConstants.NOT_VALID;
                    }
                }

                if (reticle != null)
                {
                    reticle.transform.position   = hmd.transform.position + hmd.transform.forward * reticleDistance;
                    reticle.transform.localScale = initialReticleSize;
                }
            }

            if (reticle != null)
            {
                reticle.GetComponent <MeshRenderer>().material.color = reticleColor;
            }

            //UI based interactions
            if (UIRaycast && InputModule != null)
            {
                InputModule.setUIRay(hmd.transform.position, hmd.transform.rotation, reticleDistance);
                uiHitPosition = InputModule.getuiHitPosition();
                if (uiHitPosition != EasyInputConstants.NOT_VALID && (end == EasyInputConstants.NOT_VALID || (end - hmd.transform.position).magnitude > (uiHitPosition - hmd.transform.position).magnitude))
                {
                    if ((uiHitPosition - hmd.transform.position).magnitude < reticleDistance)
                    {
                        reticle.transform.position   = uiHitPosition;
                        reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((uiHitPosition - hmd.transform.position).magnitude / reticleDistance));
                    }
                }
            }
        }