Пример #1
0
 private void OnReleased(HVRGrabberBase arg0, HVRGrabbable arg1)
 {
     if (RecoilComponent)
     {
         RecoilComponent.HandRigidBody = null;
     }
 }
Пример #2
0
        private IEnumerator GrabTimeoutRoutine(HVRGrabbable grabbable)
        {
            _timeoutGrabbable = grabbable;
            yield return(new WaitForSeconds(GrabTimeout));

            _timeoutGrabbable = null;
        }
Пример #3
0
        public override float DistanceToGrabbable(HVRGrabbable grabbable)
        {
            if (UseColliderDistance && _map.TryGetValue(grabbable, out var colliders) && grabbable.UseColliderClosestPoint)
            {
                var distance = float.MaxValue;
                var anchor   = DistanceSource ? DistanceSource.position : Grabber.transform.position;

                foreach (var grabbableCollider in colliders)
                {
                    if (!grabbableCollider)
                    {
                        continue;
                    }

                    Vector3 point;
                    if (grabbable.HasConcaveColliders && grabbableCollider is MeshCollider meshCollider && !meshCollider.convex)
                    {
                        if (!grabbableCollider.Raycast(new Ray(anchor, grabbableCollider.bounds.center - anchor), out var hit, Vector3.Distance(grabbableCollider.bounds.center, anchor)))
                        {
                            continue;
                        }

                        point = hit.point;
                    }
                    else
                    {
                        point = grabbableCollider.ClosestPoint(anchor);
                    }

                    var current = Vector3.Distance(point, anchor);
                    if (current < distance)
                    {
                        distance = current;
                    }
                }
Пример #4
0
 private void OnGrabbed(HVRGrabberBase arg0, HVRGrabbable arg1)
 {
     if (arg0 is HVRHandGrabber hand && RecoilComponent)
     {
         RecoilComponent.HandRigidBody = hand.Rigidbody;
     }
 }
Пример #5
0
 private void OnHoverGrabbableReleased(HVRGrabberBase grabber, HVRGrabbable grabbable)
 {
     UnhoverGrabbable(grabber, grabbable);
     //drop could have been a hand swap or some other swapping action
     //so we wait til next frame and see if it's not grabbed by something else this frame
     StartCoroutine(TryGrabGrabbable(grabbable));
 }
Пример #6
0
        public override bool CanHover(HVRGrabbable grabbable)
        {
            if (!base.CanHover(grabbable))
            {
                return(false);
            }

            var handGrabber = grabbable.PrimaryGrabber as HVRHandGrabber;

            if (handGrabber == null)
            {
                return(false);
            }

            //if a forward throw is happening don't grab it
            var velocity = handGrabber.ComputeThrowVelocity(grabbable, out var dummy);

            velocity.y = transform.position.y;
            if (Vector3.Dot(velocity.normalized, transform.forward) > 0f)
            {
                return(false);
            }

            return(true);
        }
        public override bool CanHover(HVRGrabbable grabbable)
        {
            if (!SocketContainer)
            {
                return(false);
            }
            if (grabbable.IsBeingForcedGrabbed)
            {
                return(false);
            }
            if (grabbable.GrabberCount != 1)
            {
                return(false);
            }
            var handGrabber = grabbable.PrimaryGrabber as HVRHandGrabber;

            if (handGrabber == null)
            {
                return(false);
            }

            if (!SocketContainer.HasAvailableSocket(grabbable))
            {
                return(false);
            }

            if (grabbable.IsStabbing || grabbable.IsStabbed)
            {
                return(false);
            }

            return(base.CanHover(grabbable));
        }
Пример #8
0
        public virtual bool IsValid(HVRGrabbable grabbable)
        {
            if (grabbable.IsStabbing && !CanGrabStabbingGrabbable || grabbable.IsStabbed)
            {
                return(false);
            }

            if (SocketFilters != null)
            {
                if (!grabbable.Socketable)
                {
                    return(false);
                }

                var anyValid = false;
                foreach (var filter in SocketFilters)
                {
                    if (filter.IsValid(grabbable.Socketable) && FilterCondition == SocketCondition.OR)
                    {
                        anyValid = true;
                        break;
                    }

                    if (!filter.IsValid(grabbable.Socketable) && FilterCondition == SocketCondition.AND)
                    {
                        return(false);
                    }
                }

                return(anyValid || FilterCondition == SocketCondition.AND);
            }

            return(true);
        }
Пример #9
0
        protected override void OnHoverEnter(HVRGrabbable grabbable)
        {
            if (ReleasesOnHover && IsGrabbing)
            {
                ForceRelease();
            }


            if (GrabsFromHand)
            {
                if (CanAddGrabbable && grabbable.IsBeingHeld && grabbable.GrabberCount == 1 &&
                    grabbable.PrimaryGrabber.IsHandGrabber && CanGrabEx(grabbable))
                {
                    grabbable.PrimaryGrabber.ForceRelease();
                    //need to let the joint get destroyed so it doesn't bring the hand into the socket area forcefully
                    this.ExecuteNextUpdate(() => TryGrab(grabbable, true));
                }

                return;
            }

            grabbable.Released.AddListener(OnHoverGrabbableReleased);



            base.OnHoverEnter(grabbable);
            if (HoverActions != null)
            {
                foreach (var action in HoverActions)
                {
                    action.OnHoverEnter(this, grabbable, IsValid(grabbable));
                }
            }
        }
Пример #10
0
 protected void UpdateBowHandCollision(HVRHandGrabber hand, HVRGrabbable arrow, bool enable)
 {
     if (hand && arrow)
     {
         hand.UpdateCollision(arrow, enable);
     }
 }
Пример #11
0
        private IEnumerator DropAndDestroy(HVRGrabbable grabbable)
        {
            yield return(null);

            grabbable.ForceRelease();
            Destroy(grabbable.gameObject);
        }
Пример #12
0
        private void OnBeforeTeleport()
        {
            if (LeftJointHand)
            {
                LeftJointHand.Disable();
            }

            if (RightJointHand)
            {
                RightJointHand.Disable();
            }

            _leftParent  = LeftHand.transform.parent;
            _rightParent = RightHand.transform.parent;

            LeftHand.transform.SetParent(transform, true);
            RightHand.transform.SetParent(transform, true);

            if (LeftHand.GrabbedTarget)
            {
                _leftTeleportGrabbable = LeftHand.GrabbedTarget;
                _leftGrabbableParent   = _leftTeleportGrabbable.transform.parent;
                _leftTeleportGrabbable.transform.SetParent(LeftHand.transform, true);
            }

            if (LeftHand.GrabbedTarget != RightHand.GrabbedTarget && RightHand.GrabbedTarget)
            {
                _rightTeleportGrabbable = RightHand.GrabbedTarget;
                _rightGrabbableParent   = _rightTeleportGrabbable.transform.parent;
                _rightTeleportGrabbable.transform.SetParent(RightHand.transform, true);
            }
        }
Пример #13
0
        private void HandleRigidBodyGrab(HVRGrabbable grabbable)
        {
            if (!grabbable.Rigidbody)
            {
                return;
            }


            switch (HoldType)
            {
            case SocketHoldType.Kinematic:
            {
                grabbable.Rigidbody.useGravity             = false;
                grabbable.Rigidbody.velocity               = Vector3.zero;
                grabbable.Rigidbody.angularVelocity        = Vector3.zero;
                grabbable.Rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
                grabbable.Rigidbody.isKinematic            = true;
                grabbable.SetAllToTrigger();
            }
            break;

            case SocketHoldType.RemoveRigidbody:
            {
                _hadRigidBody   = true;
                _mass           = Rigidbody.mass;
                Rigidbody.mass += grabbable.Rigidbody.mass;
                Destroy(grabbable.Rigidbody);
            }
            break;
            }
        }
Пример #14
0
        private void UpdateScale(HVRGrabbable grabbable)
        {
            if (!grabbable || !ScaleGrabbable)
            {
                return;
            }
            var extents = _modelBounds.extents;
            var axis    = extents.x;

            if (extents.y > axis)
            {
                axis = extents.y;
            }
            if (extents.z > axis)
            {
                axis = extents.z;
            }
            axis *= 2;
            var ratio = Size / axis;

            ratio *= grabbable.Socketable.SocketScale;
            var counterScale = grabbable.Socketable.CounterScale;

            grabbable.transform.localScale = new Vector3(ratio * counterScale.x, ratio * counterScale.y, ratio * counterScale.z);
        }
Пример #15
0
        private IEnumerator ContinueAutoGrab(HVRGrabbable grabbable, Transform grabPoint)
        {
            var elapsed = 0f;

            while (grabbable && elapsed < AdditionalAutoGrabTime && !grabbable.IsBeingHeld)
            {
                if (grabbable.Rigidbody.velocity.magnitude > MaximumVelocityAutoGrab)
                {
                    grabbable.Rigidbody.velocity *= .9f;
                }


                if ((JointAnchorWorldPosition - grabPoint.position).magnitude < AutoGrabDistance)
                {
                    if (HandGrabber.TryAutoGrab(grabbable))
                    {
                        break;
                    }
                }

                elapsed += Time.fixedDeltaTime;
                yield return(new WaitForFixedUpdate());
            }

            _additionalGrabRoutine = null;
        }
Пример #16
0
        protected override void OnHoverEnter(HVRGrabbable grabbable)
        {
            base.OnHoverEnter(grabbable);

            if (IsMine && !Mathf.Approximately(0f, HapticsDuration))
            {
                HandGrabber.Controller.Vibrate(HapticsAmplitude, HapticsDuration);
            }

            if (grabbable.ShowForceGrabIndicator)
            {
                if (grabbable.ForceGrabIndicator)
                {
                    _grabIndicator = grabbable.ForceGrabIndicator;
                }
                else
                {
                    _grabIndicator = GrabIndicator;
                }

                if (_grabIndicator)
                {
                    _grabIndicator.Enable();
                    _grabIndicator.Hover();
                }
            }
        }
Пример #17
0
 protected virtual void OnHandReleased(HVRHandGrabber arg0, HVRGrabbable arg1)
 {
     if (Arrow)
     {
         StartCoroutine(EnableBowHandCollisionRoutine(arg0, Arrow.Grabbable));
     }
     BowHand = null;
 }
Пример #18
0
 private void OnDialReleased(HVRHandGrabber arg0, HVRGrabbable arg1)
 {
     Joint.SetAngularXDrive(Spring, Damper, 10000f);
     if (StopOnRelease)
     {
         Rigidbody.angularVelocity = Vector3.zero;
     }
 }
Пример #19
0
 protected void OnReleased(HVRGrabberBase grabber, HVRGrabbable hvrGrabbable)
 {
     if (DiscardAngle)
     {
         transform.rotation = RotationTarget.rotation;
         transform.position = RotationTarget.position;
     }
 }
Пример #20
0
 public override bool CanHover(HVRGrabbable grabbable)
 {
     if (!CanGrab(grabbable))
     {
         return(false);
     }
     return(base.CanHover(grabbable));
 }
Пример #21
0
 public bool TryAddGrabbable(HVRGrabbable grabbable)
 {
     if (TryFindAvailableSocket(grabbable, out var socket))
     {
         return(socket.TryGrab(grabbable));
     }
     return(false);
 }
Пример #22
0
 private void CleanupRigidBody(HVRGrabbable grabbable)
 {
     if (HoldType == SocketHoldType.RemoveRigidbody && _hadRigidBody)
     {
         grabbable.Rigidbody = grabbable.gameObject.AddComponent <Rigidbody>();
         Rigidbody.mass      = _mass;
     }
 }
 protected override void OnHoverExit(HVRGrabbable grabbable)
 {
     if (GrabbleMustBeHeld)
     {
         grabbable.Released.RemoveListener(OnHoverGrabbableReleased);
     }
     base.OnHoverExit(grabbable);
 }
Пример #24
0
 protected virtual Quaternion GetRotationOffset(HVRGrabbable grabbable)
 {
     if (!grabbable || !grabbable.Socketable || !grabbable.Socketable.SocketOrientation)
     {
         return(Quaternion.identity);
     }
     return(grabbable.Socketable.SocketOrientation.localRotation);
 }
Пример #25
0
 protected virtual Vector3 GetPositionOffset(HVRGrabbable grabbable)
 {
     if (!grabbable || !grabbable.Socketable || !grabbable.Socketable.SocketOrientation)
     {
         return(Vector3.zero);
     }
     return(grabbable.Socketable.SocketOrientation.localPosition);
 }
Пример #26
0
        private IEnumerator TryGrabGrabbable(HVRGrabbable grabbable)
        {
            yield return(new WaitForFixedUpdate());

            if (CanAddGrabbable && TryGrab(grabbable))
            {
            }
        }
Пример #27
0
 private void OnStringGrabbed(HVRHandGrabber arg0, HVRGrabbable arg1)
 {
     if (!bow.ArrowNocked && ArrowPrefab)
     {
         var go    = Instantiate(ArrowPrefab);
         var arrow = go.GetComponent <HVRArrow>();
         bow.NockArrow(arrow);
     }
 }
Пример #28
0
        public override bool CanGrab(HVRGrabbable grabbable)
        {
            if (!ShotgunMagazine.CanAddBullet())
            {
                return(false);
            }

            return(base.CanGrab(grabbable));
        }
Пример #29
0
        protected override bool IsValid(HVRGrabbable grabbable)
        {
            if (!base.IsValid(grabbable))
            {
                return(false);
            }

            return(Grabber.CheckForLineOfSight(RayCastOrigin.position, grabbable, LayerMask, MaxDistanceAllowed, UseClosestPoint));
        }
Пример #30
0
        private void OnStabilizerReleased(HVRGrabberBase grabber, HVRGrabbable arg1)
        {
            Grabbable.ForceTwoHandSettings = false;

            if (RecoilComponent)
            {
                RecoilComponent.TwoHanded = false;
            }
        }