/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using Oculus.Interaction.Input; using UnityEngine; using UnityEngine.Assertions; namespace Oculus.Interaction { /// /// Sets the origin of the ray used by s for tracked hands. /// /// /// RayInteractors themselves are agnostic to the origin of the ray, so they can work with any /// ray but cannot calculate that ray for themselves. HandPointerPose observes an /// and uses it to compute a ray origin. /// public class HandPointerPose : MonoBehaviour, IActiveState { [Tooltip("The hand used for ray interaction")] [SerializeField, Interface(typeof(IHand))] private UnityEngine.Object _hand; /// /// The used for ray interaction. /// /// /// This value is typically set in the Unity Editor, but it can also be set programmatically during /// initialization using either or /// . /// public IHand Hand { get; private set; } /// /// How much the ray origin is offset relative to the hand. /// [Tooltip("How much the ray origin is offset relative to the hand.")] [SerializeField] private Vector3 _offset; /// /// Implements , in this case indicating whether or not a valid ray /// origin is currently available. /// public bool Active => Hand.IsPointerPoseValid; protected bool _started = false; protected virtual void Awake() { Hand = _hand as IHand; } protected virtual void Start() { this.BeginStart(ref _started); this.AssertField(Hand, nameof(Hand)); this.EndStart(ref _started); } protected virtual void OnEnable() { if (_started) { Hand.WhenHandUpdated += HandleHandUpdated; } } protected virtual void OnDisable() { if (_started) { Hand.WhenHandUpdated -= HandleHandUpdated; } } private void HandleHandUpdated() { if (Hand.GetPointerPose(out Pose pointerPose)) { pointerPose.position += pointerPose.rotation * _offset; transform.SetPose(pointerPose); } } #region Inject /// /// Sets all required dependencies for a dynamically instantiated HandPointerPose. This is a convenience method wrapping /// and . This method exists to support Interaction /// SDK's dependency injection pattern and is not needed for typical Unity Editor-based usage. /// public void InjectAllHandPointerPose(IHand hand, Vector3 offset) { InjectHand(hand); InjectOffset(offset); } /// /// Sets the an as the for a dynamically instantiated HandPointerPose. This method /// exists to support Interaction SDK's dependency injection pattern and is not needed for typical Unity Editor-based usage. /// public void InjectHand(IHand hand) { _hand = hand as UnityEngine.Object; Hand = hand; } /// /// Sets a Unity Vector3 as the ray origin offset for a dynamically instantiated HandPointerPose. This method exists to /// support Interaction SDK's dependency injection pattern and is not needed for typical Unity Editor-based usage. /// public void InjectOffset(Vector3 offset) { _offset = offset; } #endregion } }