Initial Commit

This commit is contained in:
2025-07-04 20:33:06 +03:00
commit 8f09347ae0
9219 changed files with 2447903 additions and 0 deletions
@@ -0,0 +1,104 @@
/*
* 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 System;
using Unity.Collections;
using UnityEngine;
/// <summary>
/// Represents a plane described by its <see cref="Rect"/> and boundary points.
/// </summary>
/// <remarks>
/// This component can be accessed from an <see cref="OVRAnchor"/> that supports it by calling
/// <see cref="OVRAnchor.GetComponent{T}"/> from the anchor.
/// </remarks>
/// <seealso cref="BoundingBox"/>
/// <seealso cref="TryGetBoundaryPointsCount"/>
/// <seealso cref="TryGetBoundaryPoints"/>
public readonly partial struct OVRBounded2D : IOVRAnchorComponent<OVRBounded2D>, IEquatable<OVRBounded2D>
{
/// <summary>
/// Bounding Box
/// </summary>
/// <returns>
/// <see cref="Rect"/> representing the 2D Bounding Box of the Anchor this component is attached to.
/// </returns>
/// <exception cref="InvalidOperationException">If it fails to retrieve the Bounding Box.</exception>
public Rect BoundingBox => OVRPlugin.GetSpaceBoundingBox2D(Handle, out var rectf)
? ConvertRect(rectf)
: throw new InvalidOperationException("Could not get BoundingBox");
private Rect ConvertRect(OVRPlugin.Rectf openXrRect)
{
// OpenXR Rects describe a rectangle by its position (or offset) and its size (or extents)
// https://registry.khronos.org/OpenXR/specs/1.0/man/html/XrRect2Df.html
// Unity Rects describe a rectangle by its position and its size (or extents)
// https://docs.unity3d.com/ScriptReference/Rect.html
var extents = openXrRect.Size.FromSizef();
// OpenXR uses a right-handed coordinate system
// Unity uses left-handed coordinate system
// There is a design assumption that plane's normal should coincide with +z
// We therefore need to rotate the plane 180° around +y axis
// We therefore need to flip the x axis.
var offset = openXrRect.Pos.FromFlippedXVector2f();
// When flipping one axis, position doesn't point to a min corner any more
offset.x -= extents.x;
return new Rect(offset, extents);
}
/// <summary>
/// Retrieves the number of boundary points contained in an Anchor with an enabled Bounded2D component.
/// </summary>
/// <param name="count">The number of boundary points contained in the Bounded2D component of the Anchor, as an <c>out</c> parameter.</param>
/// <returns><c>true</c> if it successfully retrieves the count, <c>false</c> otherwise.</returns>
/// <remarks>This is the first part of the two-calls idiom for retrieving boundary points. <see cref="TryGetBoundaryPoints"/> to actually get those points.</remarks>
/// <seealso cref="TryGetBoundaryPoints"/>
public bool TryGetBoundaryPointsCount(out int count) =>
OVRPlugin.GetSpaceBoundary2DCount(Handle, out count);
/// <summary>
/// Retrieves the boundary points contained in an Anchor with an enabled Bounded2D component.
/// </summary>
/// <param name="positions">The array that will get populated with the boundary points contained in the Bounded2D component of the Anchor.</param>
/// <returns><c>true</c> if it successfully populates the <paramref name="positions"/> array with the boundary points.</returns>
/// <exception cref="ArgumentException">Thrown when <paramref name="positions"/> has not been created.</exception>
/// <remarks>This is the second part of the two-calls idiom for retrieving boundary points.
/// It is expected for the <paramref name="positions"/> to be created and with enough capacity to contain the boundary points.</remarks>
/// <seealso cref="TryGetBoundaryPointsCount"/>
public bool TryGetBoundaryPoints(NativeArray<Vector2> positions)
{
if (!positions.IsCreated) throw new ArgumentException("NativeArray is not created", nameof(positions));
if (!OVRPlugin.GetSpaceBoundary2D(Handle, positions, out var count)) return false;
var low = 0;
var high = count - 1;
for (; low <= high; low++, high--)
{
var swapTemporaryPositionHigh = positions[high];
var swapTemporaryPositionLow = positions[low];
positions[low] = new Vector2(-swapTemporaryPositionHigh.x, swapTemporaryPositionHigh.y);
positions[high] = new Vector2(-swapTemporaryPositionLow.x, swapTemporaryPositionLow.y);
}
return true;
}
}