// --------------------------------------------------------------------------------
    // Force grab
    // --------------------------------------------------------------------------------
    private void OnForceGrabStart()
    {
        isForceGrabbing = true;
        forceGrabBlasterStartPosition = blaster.spawnTransform.position;
        relativePushPull = false;

        if (forceGrabbableTarget != null)
        {
            currentForceGrabDistance = initialForceGrabDistance;
            forceGrabbableTarget.OnGrab(this);
        }
    }
    private void GrabObject(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource, bool newState)
    {
        if (!isSelected)
        {
            return;
        }

        if (isGrabbing)
        {
            if (!newState)
            {
                // -- Throw the object
                isGrabbing = false;
                currentTarget.OnRelease();

                // -- Add force to the projectile
                Vector3 handDelta = Vector3.zero;

                // Iterate over each hand position, and calculate the delta. Add them up, and find the average
                foreach (Vector3 delta in handDeltaHistory)
                {
                    handDelta += delta;
                }

                currentTarget.rb.AddForce(handDelta / handPositionHistoryCount * throwForceMultiplier, ForceMode.VelocityChange);
            }
        }
        else
        {
            if (newState)
            {
                // -- Attempt to pick up an object
                if (Physics.Raycast(castingHand.transform.position, castingHand.transform.forward.normalized, out RaycastHit hit, raycastDistance, layermask))
                {
                    // -- Hit: Raycast to the collision point
                    lineRenderer.SetPosition(0, castingHand.transform.position);
                    lineRenderer.SetPosition(1, hit.point);
                    lineRendererAnimator.SetTrigger("fire");

                    // -- This object we collided with can be grabbed
                    // Check both the immediate object, and its parent.
                    //  We can have gameobjects with child colliders
                    ForceGrabbable forceGrabbable = hit.collider.GetComponent <ForceGrabbable>();
                    if (forceGrabbable == null)
                    {
                        forceGrabbable = hit.collider.GetComponentInParent <ForceGrabbable>();
                    }

                    if (forceGrabbable != null)
                    {
                        // Can't grab slotted targets
                        if (forceGrabbable.isSlotted)
                        {
                            return;
                        }

                        hoverDistance = initialHoverDistance;

                        isGrabbing    = true;
                        currentTarget = forceGrabbable;
                        currentTarget.OnGrab();
                    }
                }
                else
                {
                    // -- Missed: Raycast into air
                    lineRenderer.SetPosition(0, castingHand.transform.position);
                    lineRenderer.SetPosition(1, castingHand.transform.position + castingHand.transform.forward * raycastDistance);
                    lineRendererAnimator.SetTrigger("fire");
                }
            }
        }