/* * 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. */ #nullable enable #if USING_XR_MANAGEMENT && (USING_XR_SDK_OCULUS || USING_XR_SDK_OPENXR) && !OVRPLUGIN_UNSUPPORTED_PLATFORM #define USING_XR_SDK #endif using System.Collections.Generic; using System.Linq; using Oculus.Avatar2; using UnityEngine; using UnityEngine.UI; public class UIInputControllerView : MonoBehaviour { private const string logScope = "UIInputControllerView"; [SerializeField] private Text? controlsTextObject; private const int DIVIDER_PADDING = 15; private const int LINE_PADDING = 30; private bool _initialized; private HashSet? _controlScopesRegistered; public void PopulateControllerView() { #if USING_XR_SDK if (_initialized) { return; } _controlScopesRegistered = new HashSet(); if (controlsTextObject == null) { OvrAvatarLog.LogError("UIInputControllerView::CreateDividerTextObject : Null controlsTextMesh.", logScope); return; } controlsTextObject.text = ""; var controllerInterfaces = FindObjectsOfType().OfType().ToList(); if (!controllerInterfaces.Any()) { OvrAvatarLog.LogWarning("UIInputControllerView::PopulateControllerView : did not find any instances of IUIControllerInterface.", logScope); return; } foreach (var controllerInterface in controllerInterfaces) { var controllerList = controllerInterface.GetControlSchema(); _controlScopesRegistered ??= new HashSet(); if (_controlScopesRegistered.Contains(controllerList[0].scope)) { // skip repeated controls continue; } AddDividerText(controllerList[0].scope); for (var i = 0; i < controllerList.Count; i++) { AddControllerText(controllerList[i]); } controlsTextObject.text += "\n\n"; } _initialized = true; if (UIManager.Instance == null || !UIManager.Instance.Initialized) { OvrAvatarLog.LogError("UIInputControllerView::PopulateControllerView : Failed to retrieve UIManager instance.", logScope); return; } UIManager.Instance.AddOnPauseEvent(RefreshControllerView); #endif } private void RefreshControllerView() { #if USING_XR_SDK var controllerInterfaces = FindObjectsOfType().OfType().ToList(); if (!controllerInterfaces.Any()) { OvrAvatarLog.LogWarning("UIInputControllerView::RefreshControllerView : did not find any instances of IUIControllerInterface.", logScope); return; } foreach (var controllerInterface in controllerInterfaces) { var controllerList = controllerInterface.GetControlSchema(); _controlScopesRegistered ??= new HashSet(); if (_controlScopesRegistered.Contains(controllerList[0].scope)) { // skip repeated controls continue; } AddDividerText(controllerList[0].scope); for (var i = 0; i < controllerList.Count; i++) { AddControllerText(controllerList[i]); } if (controlsTextObject == null) { OvrAvatarLog.LogError("UIInputControllerView::RefreshControllerView : Null controlsTextMesh.", logScope); return; } controlsTextObject.text += "\n\n"; } #endif } private void AddDividerText(string scope) { _controlScopesRegistered ??= new HashSet(); _controlScopesRegistered.Add(scope); if (controlsTextObject == null) { OvrAvatarLog.LogError("UIInputControllerView::AddDividerText : Null controlsTextMesh.", logScope); return; } var divider = new string('=', DIVIDER_PADDING); var formattedText = $"{divider} {scope.Trim()} {divider}\n\n"; controlsTextObject.text += formattedText; } #if USING_XR_SDK private void AddControllerText(UIInputControllerButton controllerButton) { var controlsText = ""; // combination buttons if (controllerButton.combinationButtons != null && controllerButton.combinationButtons.Count > 0) { controlsText += controllerButton.controller + " - " + controllerButton.combinationButtons[0]; for (var i = 1; i < controllerButton.combinationButtons.Count; i++) { controlsText += " + " + controllerButton.combinationButtons[i]; } } else { controlsText = controllerButton.controller + " - " + (controllerButton.button != default ? controllerButton.button.ToString() : controllerButton.axis2d.ToString()); } if (this.controlsTextObject == null) { OvrAvatarLog.LogError("UIInputControllerView::AddControllerText : Null controlsTextMesh.", logScope); return; } controlsText = controlsText.Trim().PadRight(LINE_PADDING); this.controlsTextObject.text += controlsText + ": " + controllerButton.description.Trim() + "\n"; } #endif }