using System; using System.Collections; using UnityEngine; using Valve.VR; using OpenVRUtil; public class Beamy : MonoBehaviour { public new Camera camera; private RenderTexture renderTexture; public ETrackedControllerRole targetHand = ETrackedControllerRole.RightHand; private ulong overlayHandle = OpenVR.k_ulOverlayHandleInvalid; private Coroutine sleepCoroutine; [Range(0, 0.5f)] public float size; [Range(-0.2f, 0.2f)] public float leftX; [Range(-0.2f, 0.2f)] public float leftY; [Range(-0.2f, 0.2f)] public float leftZ; [Range(0, 360)] public int leftRotationX; [Range(0, 360)] public int leftRotationY; [Range(0, 360)] public int leftRotationZ; [Range(-0.2f, 0.2f)] public float rightX; [Range(-0.2f, 0.2f)] public float rightY; [Range(-0.2f, 0.2f)] public float rightZ; [Range(0, 360)] public int rightRotationX; [Range(0, 360)] public int rightRotationY; [Range(0, 360)] public int rightRotationZ; private void Start() { OpenVRUtil.System.InitOpenVR(); overlayHandle = Overlay.CreateOverlay("f3.beamy", "Beamy"); //Vertically flip the renderTexture for non-OpenGL environments Overlay.FlipOverlayVertical(overlayHandle); // Set camera.targetTexture to write the camera output to the render texture. renderTexture = new RenderTexture(512, 512, 16, RenderTextureFormat.ARGBFloat); camera.targetTexture = renderTexture; Overlay.SetOverlaySize(overlayHandle, size); // Overlay.ShowOverlay(overlayHandle); } private void Update() { Vector3 position; Quaternion rotation; if (targetHand == ETrackedControllerRole.LeftHand) { position = new Vector3(leftX, leftY, leftZ); rotation = Quaternion.Euler(leftRotationX, leftRotationY, leftRotationZ); } else { position = new Vector3(rightX, rightY, rightZ); rotation = Quaternion.Euler(rightRotationX, rightRotationY, rightRotationZ); } // SetOverlaySize(overlayHandle, size); // var position = new Vector3(x, y, z); // var rotation = Quaternion.Euler(rotationX, rotationY, rotationZ); // var rightControllerIndex = OpenVR.System.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand); // if (rightControllerIndex != OpenVR.k_unTrackedDeviceIndexInvalid) { // SetOverlayTransformRelative(overlayHandle, rightControllerIndex, position, rotation); // } var controllerIndex = OpenVR.System.GetTrackedDeviceIndexForControllerRole(targetHand); if (controllerIndex != OpenVR.k_unTrackedDeviceIndexInvalid) { Overlay.SetOverlayTransformRelative(overlayHandle, controllerIndex, position, rotation); } if (!renderTexture.IsCreated()) { return; } Overlay.SetOverlayRenderTexture(overlayHandle, renderTexture); } private void OnApplicationQuit() { Overlay.DestroyOverlay(overlayHandle); } private void OnDestroy() { OpenVRUtil.System.ShutdownOpenVR(); } public void OnWakeUp() { Overlay.ShowOverlay(overlayHandle); if (sleepCoroutine != null) { StopCoroutine(sleepCoroutine); } sleepCoroutine = StartCoroutine(Sleep()); } private IEnumerator Sleep() { yield return new WaitForSeconds(3); Overlay.HideOverlay(overlayHandle); } }