Exemplo n.º 1
0
 protected virtual void OffhandGrabbed(SyncVRGrabbable grabbable)
 {
     if (m_grabbedObj == grabbable)
     {
         GrabbableRelease(Vector3.zero, Vector3.zero);
     }
 }
Exemplo n.º 2
0
    void OnTriggerExit(Collider otherCollider)
    {
        SyncVRGrabbable grabbable = otherCollider.GetComponent <SyncVRGrabbable>() ?? otherCollider.GetComponentInParent <SyncVRGrabbable>();

        if (grabbable == null)
        {
            return;
        }

        // Remove the grabbable
        int  refCount = 0;
        bool found    = m_grabCandidates.TryGetValue(grabbable, out refCount);

        if (!found)
        {
            return;
        }

        if (refCount > 1)
        {
            m_grabCandidates[grabbable] = refCount - 1;
        }
        else
        {
            m_grabCandidates.Remove(grabbable);
        }
    }
Exemplo n.º 3
0
 protected void GrabbableRelease(Vector3 linearVelocity, Vector3 angularVelocity)
 {
     m_grabbedObj.GrabEnd(linearVelocity, angularVelocity);
     if (m_parentHeldObject)
     {
         m_grabbedObj.transform.parent = null;
     }
     SetPlayerIgnoreCollision(m_grabbedObj.gameObject, false);
     m_grabbedObj = null;
 }
Exemplo n.º 4
0
    public void ForceRelease(SyncVRGrabbable grabbable)
    {
        bool canRelease = (
            (m_grabbedObj != null) &&
            (m_grabbedObj == grabbable)
            );

        if (canRelease)
        {
            GrabEnd();
        }
    }
Exemplo n.º 5
0
    void OnTriggerEnter(Collider otherCollider)
    {
        // Get the grab trigger
        SyncVRGrabbable grabbable = otherCollider.GetComponent <SyncVRGrabbable>() ?? otherCollider.GetComponentInParent <SyncVRGrabbable>();

        if (grabbable == null)
        {
            return;
        }

        // Add the grabbable
        int refCount = 0;

        m_grabCandidates.TryGetValue(grabbable, out refCount);
        m_grabCandidates[grabbable] = refCount + 1;
    }
Exemplo n.º 6
0
    protected virtual void GrabBegin()
    {
        float           closestMagSq             = float.MaxValue;
        SyncVRGrabbable closestGrabbable         = null;
        Collider        closestGrabbableCollider = null;

        // Iterate grab candidates and find the closest grabbable candidate
        foreach (SyncVRGrabbable grabbable in m_grabCandidates.Keys)
        {
            bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab);
            if (!canGrab)
            {
                continue;
            }

            for (int j = 0; j < grabbable.grabPoints.Length; ++j)
            {
                Collider grabbableCollider = grabbable.grabPoints[j];
                // Store the closest grabbable
                Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position);
                float   grabbableMagSq       = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude;
                if (grabbableMagSq < closestMagSq)
                {
                    closestMagSq             = grabbableMagSq;
                    closestGrabbable         = grabbable;
                    closestGrabbableCollider = grabbableCollider;
                }
            }
        }

        // Disable grab volumes to prevent overlaps
        GrabVolumeEnable(false);

        if (closestGrabbable != null)
        {
            if (closestGrabbable.isGrabbed)
            {
                closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable);
            }

            m_grabbedObj = closestGrabbable;
            m_grabbedObj.GrabBegin(this, closestGrabbableCollider);

            m_lastPos = transform.position;
            m_lastRot = transform.rotation;

            // Set up offsets for grabbed object desired position relative to hand.
            if (m_grabbedObj.snapPosition)
            {
                m_grabbedObjectPosOff = m_gripTransform.localPosition;
                if (m_grabbedObj.snapOffset)
                {
                    Vector3 snapOffset = m_grabbedObj.snapOffset.position;
#if OCULUS
                    if (m_controller == OVRInput.Controller.LTouch)
                    {
                        snapOffset.x = -snapOffset.x;
                    }
#endif
                    m_grabbedObjectPosOff += snapOffset;
                }
            }
            else
            {
                Vector3 relPos = m_grabbedObj.transform.position - transform.position;
                relPos = Quaternion.Inverse(transform.rotation) * relPos;
                m_grabbedObjectPosOff = relPos;
            }

            if (m_grabbedObj.snapOrientation)
            {
                m_grabbedObjectRotOff = m_gripTransform.localRotation;
                if (m_grabbedObj.snapOffset)
                {
                    m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff;
                }
            }
            else
            {
                Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation;
                m_grabbedObjectRotOff = relOri;
            }

            // Note: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high
            // speed and sends them flying. The grabbed object may still teleport inside of other objects, but fixing that
            // is beyond the scope of this demo.
            MoveGrabbedObject(m_lastPos, m_lastRot, true);
            SetPlayerIgnoreCollision(m_grabbedObj.gameObject, true);
            if (m_parentHeldObject)
            {
                m_grabbedObj.transform.parent = transform;
            }
        }
    }