예제 #1
0
 public virtual void OnSlowFrame(VrEventInfo processedVrEventInfo)
 {
     if (timerRunning)
     {
         ControllerInput.Instance.SetHudTime(timeRemaining / timeToCompleteActivity, timeRemaining);
     }
 }
예제 #2
0
        public override void OnTriggerClickDown(VrEventInfo info)
        {
            base.OnTriggerClickDown(info);

            baseRotation           = transform.rotation.eulerAngles;
            baseRotationController = info.ControllerRotation.eulerAngles;
        }
        public override void OnFrame(VrEventInfo processedVrEventInfo)
        {
            base.OnFrame(processedVrEventInfo);

            if (finished)
            {
                return;
            }

            switch (processedVrEventInfo.EventType)
            {
            case VrEventInfo.VrEventType.TriggerDown:
            case VrEventInfo.VrEventType.TouchpadClickDown:
                if (!started)
                {
                    started = true;
                    if (dismissOnAction)
                    {
                        if (infoPanel && !introOnly)
                        {
                            infoPanel.Show(false);
                        }
                    }
                    if (timeToCompleteActivity > 0f)
                    {
                        StartTimer();
                    }
                }
                break;
            }
        }
예제 #4
0
 /// <summary>
 /// Forwarded by ActivityManager to the current
 /// activity
 /// </summary>
 /// <param name="info"></param>
 public virtual void OnFrame(VrEventInfo processedVrEventInfo)
 {
     if (currentState)
     {
         currentState.OnFrame(processedVrEventInfo);
     }
 }
예제 #5
0
        public virtual void OnTriggerClickDown(VrEventInfo info)
        {
            triggerDown = true;

            clickdownOffset = info.PointerTarget - transform.position;

            if (rolloverPrompt)
            {
                rolloverPrompt.SetActive(false);
            }

            if (sharedInfo && clickdownTextData.Usable())
            {
                sharedInfo.SetText(clickdownTextData);
            }

            textReceiver?.ReceiveClickdownText(clickdownTextData);

            if (clickdownPrompt)
            {
                clickdownPrompt.SetActive(true);
                if (!promptsFixed)
                {
                    Utils.FaceCamera(clickdownPrompt.transform, ControllerInput.Instance.Player);
                }

                clickdownTimer = 0f;
            }

            ClickDownEffect();

            clickDownAction?.Invoke(this);
        }
예제 #6
0
        public virtual void OnTriggerClickUp(VrEventInfo info)
        {
            triggerDown = false;
            if (clickdownPrompt)
            {
                clickdownPrompt.SetActive(false);
            }

            if (sharedInfo)
            {
                sharedInfo.Show(false);
            }

            textReceiver?.ReceiveClickdownText(null);

            if (attachedJoint)
            {
                attachedJoint.connectedBody = null;
                attachedJoint = null;
            }

            ClickUpEffect();

            clickUpAction?.Invoke(this);
        }
예제 #7
0
 /// <summary>
 /// This message may come directly from ControllerInput
 /// or may be processed by an intermediary
 /// </summary>
 /// <param name="info"></param>
 public void OnFrame(VrEventInfo processedVrEventInfo)
 {
     if (CurrentActivity)
     {
         CurrentActivity.OnFrame(processedVrEventInfo);
     }
 }
예제 #8
0
        /// <summary>
        /// For a more analogue feel. Works 4-way continuous,
        /// bit a bit hard to control. And probably don't need
        /// or want strafing
        /// </summary>
        /// <param name="processedVrEventInfo"></param>
        /// <returns></returns>
        public static bool HandleUserNavigation(VrEventInfo processedVrEventInfo, out Vector3 targetPoint, out float travelAngle, out Vector3 guidePoint)
        {
            Vector3 controllerDir = processedVrEventInfo.ControllerDirection.normalized;
            float   dot           = Vector3.Dot(controllerDir, Vector3.up);

            travelAngle = 0f;
            guidePoint  = Vector3.zero;
            targetPoint = Vector3.zero;

            if (dot > -.75f && dot < .75f) // Originally .5f
            {
                Vector3 playerPos = ControllerInput.Instance.PlayerRb.position;
                travelAngle = GetTravelAngle(processedVrEventInfo);
                Debug.Log("Travel angle: " + travelAngle);
                guidePoint   = processedVrEventInfo.ControllerPosition + Quaternion.AngleAxis(travelAngle, Vector3.up) * controllerDir * 2f;
                guidePoint.y = playerPos.y;

                targetPoint = Vector3.MoveTowards(playerPos, guidePoint, ActivitySettings.Asset.playerSpeed * Time.fixedDeltaTime);

                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #9
0
 public virtual void PushPull(VrEventInfo processedVrEventInfo)
 {
     if (!processedVrEventInfo.TouchIsDown)
     {
         processedVrEventInfo.BeamDistance += (processedVrEventInfo.TouchpadMoved.y * Time.deltaTime * ActivitySettings.Asset.beamExtensionSpeed);
         processedVrEventInfo.BeamDistance  = Mathf.Clamp(processedVrEventInfo.BeamDistance, ActivitySettings.Asset.minBeamLength, ActivitySettings.Asset.maxBeamLength);
     }
 }
예제 #10
0
 public override void OnTriggerClickUp(VrEventInfo info)
 {
     base.OnTriggerClickUp(info);
     if (OnClick != null)
     {
         OnClick(this);
     }
 }
예제 #11
0
        public override void OnTriggerClickUp(VrEventInfo info)
        {
            base.OnTriggerClickUp(info);

            if (switchGrid)
            {
                switchGrid.OnChildSelection?.Invoke(this);
            }
        }
예제 #12
0
 public override void OnTriggerClickUp(VrEventInfo info)
 {
     base.OnTriggerClickUp(info);
     if (pointerWithin)
     {
         ueResponse?.Invoke();
         response?.Invoke(ourIndex);
     }
 }
예제 #13
0
        public override void OnFrame(VrEventInfo processedVrEventInfo)
        {
            SetControllerOrientation(processedVrEventInfo.ControllerPosition, processedVrEventInfo.ControllerRotation);
            SetReticlePosition(processedVrEventInfo.HoldingTargetPosition);

            AlignReticleToCamera();

            Draw();
        }
예제 #14
0
        public override void OnTriggerClickDown(VrEventInfo info)
        {
            base.OnTriggerClickDown(info);

            baseRotation           = transform.rotation.eulerAngles;
            baseRotationController = info.ControllerRotation.eulerAngles;
            rotationAccum          = 0f;
            previousAngle          = baseRotationController.z;
        }
예제 #15
0
        /// <summary>
        /// First check there's no x,y == 0,0 touchpad reading
        /// before calling this
        /// </summary>
        /// <param name="processedVrEventInfo"></param>
        /// <returns></returns>
        public static float GetTravelAngle(VrEventInfo processedVrEventInfo)
        {
            double theta = Mathf.Atan2(processedVrEventInfo.TouchpadPosition.x, processedVrEventInfo.TouchpadPosition.y);

            if (theta < 0.0)
            {
                theta += TWOPI;
            }
            return((float)(RAD2DEG * theta));
        }
예제 #16
0
 public override void Handle(VrEventInfo info)
 {
     if (interactionDispatcher)
     {
         info = interactionDispatcher.DispatchInteraction(info);
     }
     if (beamPointer)
     {
         beamPointer.OnFrame(info);
     }
 }
예제 #17
0
        public static Vector3 GetOneAxisMovement(VrEventInfo processedVrEventInfo)
        {
            Vector3 controllerDir = processedVrEventInfo.ControllerDirection.normalized;
            Vector3 playerPos     = ControllerInput.Instance.PlayerRb.position;

            Vector3 targetPoint = playerPos + controllerDir * ActivitySettings.Asset.playerSpeed;

            targetPoint.y = playerPos.y;

            return(targetPoint);
        }
예제 #18
0
        /// <summary>
        /// Looks for any objects of interest and
        /// sets RaycastHitPosition, which will either
        /// correspond with the raycast hit point
        /// or the end of the beam of specificed
        /// length
        /// </summary>
        private VrEventInfo UpdateRaycaster(VrEventInfo vrEventInfo)
        {
            vrEventInfo.PrevHitObject    = vrEventInfo.HitObject;
            vrEventInfo.genericHitObject = null;
#if USING_UUI
            if (CheckUiObjects(ref vrEventInfo))
            {
                vrEventInfo.RaycastHit    = true; // Do we need a separate UI cast hit flag? Probably not, as we're only interested in positioning the reticle
                vrEventInfo.RaycastNormal = -vrEventInfo.UiTargetGameObject.transform.forward;
                vrEventInfo.HitObject     = null;
            }
            else
#endif
            bool gotHit = false;
            if (Physics.RaycastNonAlloc(vrEventInfo.ControllerPosition, vrEventInfo.ControllerDirection, physicsRaycasts,
                                        ActivitySettings.Asset.raycastDistance, ActivitySettings.Asset.interactableTarget) > 0)
            {
                gotHit = true;

                Graspable hitObject = physicsRaycasts[0].transform.gameObject.GetComponent <Graspable>();
                if (!hitObject) // This might be a child 'trap' for a raycast such as a label
                {
                    hitObject = physicsRaycasts[0].transform.gameObject.GetComponentInParent <Graspable>();
                }

                // Ignore anything with a Graspable that's marked as dormant
                if (hitObject && hitObject.Dormant)
                {
                    gotHit = false;
                }

                if (gotHit)
                {
                    vrEventInfo.RaycastHit         = true;
                    vrEventInfo.RaycastHitPosition = physicsRaycasts[0].point;
                    vrEventInfo.RaycastNormal      = physicsRaycasts[0].normal;
                    vrEventInfo.BeamDistance       = physicsRaycasts[0].distance;
                    vrEventInfo.PointerDotWithUp   = Vector3.Dot(vrEventInfo.ControllerDirection, Vector3.up);
                    vrEventInfo.HitObject          = hitObject;
                    vrEventInfo.genericHitObject   = physicsRaycasts[0].transform.gameObject;
                }
            }

            if (!gotHit)
            {
                vrEventInfo.RaycastHit         = false;
                vrEventInfo.RaycastHitPosition = vrEventInfo.ControllerPosition + vrEventInfo.ControllerDirection * ActivitySettings.Asset.raycastDistance;
                vrEventInfo.BeamDistance       = ActivitySettings.Asset.raycastDistance;
                vrEventInfo.HitObject          = null;
            }

            return(vrEventInfo);
        }
예제 #19
0
        public override void OnFrame(VrEventInfo processedVrEventInfo)
        {
            base.OnFrame(processedVrEventInfo);

            switch (processedVrEventInfo.EventType)
            {
            case VrEventInfo.VrEventType.TriggerDown:
            case VrEventInfo.VrEventType.TouchpadClickDown:
                StartTimer();
                break;
            }
        }
예제 #20
0
        public override void OnTriggerClickDown(VrEventInfo info)
        {
            base.OnTriggerClickDown(info);

            Utils.FaceCamera(transform);

            baseRotation           = transform.rotation.eulerAngles;
            baseRotationController = info.ControllerRotation.eulerAngles;

            Debug.LogFormat("Base rotation pourable: {0}. Base rotation controller: {1}", baseRotation, baseRotationController);

            isSelected = true;
        }
예제 #21
0
        public override void OnTriggerClickUp(VrEventInfo info)
        {
            base.OnTriggerClickUp(info);
            if (animator)
            {
                animator.SetTrigger(clickUpTrigger);
            }

            if (OnClick != null)
            {
                OnClick(this);
            }
        }
예제 #22
0
        public override void OnFrame(VrEventInfo processedVrEventInfo)
        {
            base.OnFrame(processedVrEventInfo);

            switch (processedVrEventInfo.EventType)
            {
            case VrEventInfo.VrEventType.TriggerDown:
                break;

            default:
                break;
            }
        }
예제 #23
0
 public override void OnTriggerClickUp(VrEventInfo info)
 {
     base.OnTriggerClickUp(info);
     if (returnOnRelease)
     {
         transform.position = initialPos; // TODO: animate this
     }
     audioLooper.Stop();
     if (mopEffect)
     {
         mopEffect.SetMode(false);
     }
 }
예제 #24
0
        public override void OnTriggerClickUp(VrEventInfo info)
        {
            base.OnTriggerClickUp(info);

            if (PouringComplete != null)
            {
                PouringComplete(this, targetedPourTotal);
            }

            baseRotation = transform.rotation.eulerAngles;

            isSelected = false;
            SetPour(false);
        }
예제 #25
0
        public override void OnSlowFrame(VrEventInfo processedVrEventInfo)
        {
            if (complete)
            {
                return;
            }

            if (Done() && !scored)
            {
                scored   = true;
                complete = true;
                continueButton.Activate(scoreText, BringInChef);
            }
        }
예제 #26
0
        public override void OnTriggerClickUp(VrEventInfo info)
        {
            base.OnTriggerClickUp(info);

            if (pointerWithin && clickUpEvent != null)
            {
                clickUpEvent.Invoke();
            }
            if (trigger != null)
            {
                trigger();
            }

            timedAction = null;
        }
예제 #27
0
        /// <summary>
        /// Process status of Graspable
        /// </summary>
        /// <param name="hitObject"></param>
        protected virtual VrEventInfo CheckGrabbableObject(VrEventInfo vrEventInfo)
        {
            if (!vrEventInfo.HitObject)
            {
                if (vrEventInfo.PrevHitObject)
                {
                    vrEventInfo.PrevHitObject.OnPointerExit();
                    vrEventInfo.PrevHitObject.Clear();
                    vrEventInfo.PrevHitObject      = null;
                    vrEventInfo.TargetObjectStatus = VrEventInfo.VrTargetObjectStatus.Unhighlighted;
                }
            }
            else
            {
                if (vrEventInfo.HitObject != vrEventInfo.PrevHitObject)
                {
                    if (vrEventInfo.PrevHitObject)
                    {
                        vrEventInfo.PrevHitObject.OnPointerExit();
                        vrEventInfo.PrevHitObject.Clear();
                        vrEventInfo.PrevHitObject = null;
                    }

                    bool okHit = false;
                    if (vrEventInfo.HitObject)
                    {
                        if (vrEventInfo.HitObject.IsA <Teleportable>())
                        {
                            if (vrEventInfo.PointerDotWithUp >= ActivitySettings.Asset.minimumAngleForTeleport)
                            {
                                okHit = true;
                            }
                        }
                        else
                        {
                            okHit = true;
                        }
                    }
                    if (okHit)
                    {
                        vrEventInfo.HitObject.OnPointerEnter();
                        vrEventInfo.TargetObjectStatus = VrEventInfo.VrTargetObjectStatus.Highlighted;
                    }
                }
            }

            return(vrEventInfo);
        }
예제 #28
0
        public override void OnFrame(VrEventInfo processedVrEventInfo)
        {
            SetControllerOrientation(processedVrEventInfo.ControllerPosition, processedVrEventInfo.ControllerRotation);

            SetReticlePosition(processedVrEventInfo.ControllerPosition.AbsoluteLerp(processedVrEventInfo.RaycastHitPosition, ActivitySettings.Asset.inset));

            if (processedVrEventInfo.RaycastHit)
            {
                SetReticleOrientation(processedVrEventInfo.RaycastNormal);
            }
            else
            {
                AlignReticleToCamera();
            }

            Draw(true, processedVrEventInfo.RaycastHit || ActivitySettings.Asset.showReticleAlways);
        }
예제 #29
0
        public virtual void ProcessGrabbedObject(VrEventInfo processedVrEventInfo)
        {
            if (processedVrEventInfo.GrabbedObject)
            {
                processedVrEventInfo.GrabbedObject.UpdateRotation(processedVrEventInfo.ControllerRotation);

                if (processedVrEventInfo.TouchIsTouched)
                {
                    PushPull(processedVrEventInfo);
                }

                Vector3 newPos = processedVrEventInfo.PointerTarget;

                processedVrEventInfo.GrabbedObject.MoveTo(newPos);
                processedVrEventInfo.HoldingTargetPosition = newPos;
            }
        }
        public override void OnFrame(VrEventInfo processedVrEventInfo)
        {
            base.OnFrame(processedVrEventInfo);

            switch (processedVrEventInfo.EventType)
            {
            case VrEventInfo.VrEventType.TriggerDown:
                break;
            }

            if (newCable)
            {
                Vector3 cableDest = ControllerInput.Instance.ControllerPosition +
                                    ControllerInput.Instance.ControllerDirection * beamLengthAtTerminal;
                newCable.UpdateConnection(cableDest);
            }
        }