using System; using System.Threading.Tasks; using Unity.Collections; using UnityEngine; /// /// A smaller helper class for Custom Scene Manager samples. /// public class SceneManagerHelper { public GameObject AnchorGameObject { get; } public SceneManagerHelper(GameObject gameObject) { AnchorGameObject = gameObject; } public void SetLocation(OVRLocatable locatable, Camera camera = null) { if (!locatable.TryGetSceneAnchorPose(out var pose)) return; var projectionCamera = camera == null ? Camera.main : camera; var position = pose.ComputeWorldPosition(projectionCamera); var rotation = pose.ComputeWorldRotation(projectionCamera); if (position != null && rotation != null) AnchorGameObject.transform.SetPositionAndRotation( position.Value, rotation.Value); } public void CreatePlane(OVRBounded2D bounds) { var planeGO = GameObject.CreatePrimitive(PrimitiveType.Cube); planeGO.name = "Plane"; planeGO.transform.SetParent(AnchorGameObject.transform, false); planeGO.transform.localScale = new Vector3( bounds.BoundingBox.size.x, bounds.BoundingBox.size.y, 0.01f); planeGO.GetComponent().material.SetColor( "_Color", UnityEngine.Random.ColorHSV()); } public void UpdatePlane(OVRBounded2D bounds) { var planeGO = AnchorGameObject.transform.Find("Plane"); if (planeGO == null) CreatePlane(bounds); else { planeGO.transform.localScale = new Vector3( bounds.BoundingBox.size.x, bounds.BoundingBox.size.y, 0.01f); } } public void CreateVolume(OVRBounded3D bounds) { var volumeGO = GameObject.CreatePrimitive(PrimitiveType.Cube); volumeGO.name = "Volume"; volumeGO.transform.SetParent(AnchorGameObject.transform, false); volumeGO.transform.localPosition = new Vector3( 0, 0, -bounds.BoundingBox.size.z / 2); volumeGO.transform.localScale = bounds.BoundingBox.size; volumeGO.GetComponent().material.SetColor( "_Color", UnityEngine.Random.ColorHSV()); } public void UpdateVolume(OVRBounded3D bounds) { var volumeGO = AnchorGameObject.transform.Find("Volume"); if (volumeGO == null) CreateVolume(bounds); else { volumeGO.transform.localPosition = new Vector3( 0, 0, -bounds.BoundingBox.size.z / 2); volumeGO.transform.localScale = bounds.BoundingBox.size; } } public void CreateMesh(OVRTriangleMesh mesh) { if (!mesh.TryGetCounts(out var vcount, out var tcount)) return; using var vs = new NativeArray(vcount, Allocator.Temp); using var ts = new NativeArray(tcount * 3, Allocator.Temp); if (!mesh.TryGetMesh(vs, ts)) return; var trimesh = new Mesh(); trimesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; trimesh.SetVertices(vs); trimesh.SetTriangles(ts.ToArray(), 0); var meshGO = GameObject.CreatePrimitive(PrimitiveType.Quad); meshGO.name = "Mesh"; meshGO.transform.SetParent(AnchorGameObject.transform, false); meshGO.GetComponent().sharedMesh = trimesh; meshGO.GetComponent().sharedMesh = trimesh; meshGO.GetComponent().material.SetColor( "_Color", UnityEngine.Random.ColorHSV()); } public void UpdateMesh(OVRTriangleMesh mesh) { var meshGO = AnchorGameObject.transform.Find("Mesh"); if (meshGO != null) UnityEngine.Object.Destroy(meshGO); CreateMesh(mesh); } /// /// A wrapper function for requesting Scene Capture. /// public static async Task RequestSceneCapture() { if (SceneCaptureRunning) return false; SceneCaptureRunning = true; var waiting = true; Action onCaptured = (id, success) => { waiting = false; }; // subscribe, make non-blocking call, yield and wait return await Task.Run(() => { OVRManager.SceneCaptureComplete += onCaptured; if (!OVRPlugin.RequestSceneCapture("", out var _)) { OVRManager.SceneCaptureComplete -= onCaptured; SceneCaptureRunning = false; return false; } while (waiting) Task.Delay(200); OVRManager.SceneCaptureComplete -= onCaptured; SceneCaptureRunning = false; return true; }); } private static bool SceneCaptureRunning = false; // single instance /// /// A wrapper function for requesting the Android /// permission for scene data. /// public static void RequestScenePermission() { const string permission = "com.oculus.permission.USE_SCENE"; if (!UnityEngine.Android.Permission.HasUserAuthorizedPermission(permission)) UnityEngine.Android.Permission.RequestUserPermission(permission); } }