123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /************************************************************************************
- Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
- Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
- the Utilities 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/utilities-1.31
- Unless required by applicable law or agreed to in writing, the Utilities 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 UnityEngine;
- using System.Collections.Generic;
- #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID
- internal class OVRCompositionUtil {
- public static void SafeDestroy(GameObject obj)
- {
- if (Application.isPlaying)
- {
- GameObject.Destroy(obj);
- }
- else
- {
- GameObject.DestroyImmediate(obj);
- }
- }
- public static void SafeDestroy(ref GameObject obj)
- {
- if (obj != null)
- {
- SafeDestroy(obj);
- obj = null;
- }
- }
- public static OVRPlugin.CameraDevice ConvertCameraDevice(OVRManager.CameraDevice cameraDevice)
- {
- if (cameraDevice == OVRManager.CameraDevice.WebCamera0)
- {
- return OVRPlugin.CameraDevice.WebCamera0;
- }
- else if (cameraDevice == OVRManager.CameraDevice.WebCamera1)
- {
- return OVRPlugin.CameraDevice.WebCamera1;
- }
- else if (cameraDevice == OVRManager.CameraDevice.ZEDCamera)
- {
- return OVRPlugin.CameraDevice.ZEDCamera;
- }
- else
- {
- return OVRPlugin.CameraDevice.None;
- }
- }
- public static OVRBoundary.BoundaryType ToBoundaryType(OVRManager.VirtualGreenScreenType type)
- {
- if (type == OVRManager.VirtualGreenScreenType.OuterBoundary)
- {
- return OVRBoundary.BoundaryType.OuterBoundary;
- }
- else if (type == OVRManager.VirtualGreenScreenType.PlayArea)
- {
- return OVRBoundary.BoundaryType.PlayArea;
- }
- else
- {
- Debug.LogWarning("Unmatched VirtualGreenScreenType");
- return OVRBoundary.BoundaryType.OuterBoundary;
- }
- }
- public static Vector3 GetWorldPosition(Vector3 trackingSpacePosition)
- {
- OVRPose tsPose;
- tsPose.position = trackingSpacePosition;
- tsPose.orientation = Quaternion.identity;
- OVRPose wsPose = OVRExtensions.ToWorldSpacePose(tsPose);
- Vector3 pos = wsPose.position;
- return pos;
- }
- public static float GetMaximumBoundaryDistance(Camera camera, OVRBoundary.BoundaryType boundaryType)
- {
- if (!OVRManager.boundary.GetConfigured())
- {
- return float.MaxValue;
- }
- Vector3[] geometry = OVRManager.boundary.GetGeometry(boundaryType);
- if (geometry.Length == 0)
- {
- return float.MaxValue;
- }
- float maxDistance = -float.MaxValue;
- foreach (Vector3 v in geometry)
- {
- Vector3 pos = GetWorldPosition(v);
- float distance = Vector3.Dot(camera.transform.forward, pos);
- if (maxDistance < distance)
- {
- maxDistance = distance;
- }
- }
- return maxDistance;
- }
- public static Mesh BuildBoundaryMesh(OVRBoundary.BoundaryType boundaryType, float topY, float bottomY)
- {
- if (!OVRManager.boundary.GetConfigured())
- {
- return null;
- }
- List<Vector3> geometry = new List<Vector3>(OVRManager.boundary.GetGeometry(boundaryType));
- if (geometry.Count == 0)
- {
- return null;
- }
- geometry.Add(geometry[0]);
- int numPoints = geometry.Count;
- Vector3[] vertices = new Vector3[numPoints * 2];
- Vector2[] uvs = new Vector2[numPoints * 2];
- for (int i = 0; i < numPoints; ++i)
- {
- Vector3 v = geometry[i];
- vertices[i] = new Vector3(v.x, bottomY, v.z);
- vertices[i + numPoints] = new Vector3(v.x, topY, v.z);
- uvs[i] = new Vector2((float)i / (numPoints - 1), 0.0f);
- uvs[i + numPoints] = new Vector2(uvs[i].x, 1.0f);
- }
- int[] triangles = new int[(numPoints - 1) * 2 * 3];
- for (int i = 0; i < numPoints - 1; ++i)
- {
- // the geometry is built clockwised. only the back faces should be rendered in the camera frame mask
- triangles[i * 6 + 0] = i;
- triangles[i * 6 + 1] = i + numPoints;
- triangles[i * 6 + 2] = i + 1 + numPoints;
- triangles[i * 6 + 3] = i;
- triangles[i * 6 + 4] = i + 1 + numPoints;
- triangles[i * 6 + 5] = i + 1;
- }
- Mesh mesh = new Mesh();
- mesh.vertices = vertices;
- mesh.uv = uvs;
- mesh.triangles = triangles;
- return mesh;
- }
- }
- #endif
|