/*
* 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.Collections;
using UnityEngine;
using NUnit.Framework;
using UnityEngine.TestTools;
using UnityEngine.TestTools.Utils;
namespace Meta.XR.MRUtilityKit.Tests
{
public class ClosestSurfacePositionTests : MRUKTestBase
{
private MRUKRoom _currentRoom;
[UnitySetUp]
public IEnumerator SetUp()
{
yield return LoadScene("Packages/com.meta.xr.mrutilitykit/Tests/RayCastTests.unity");
_currentRoom = MRUK.Instance.GetCurrentRoom();
}
[UnityTearDown]
public IEnumerator TearDown()
{
yield return UnloadScene();
}
///
/// Test that the position is inside a volume closest to the Y Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Plane_Closest()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.1f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH, MRUKAnchor.ComponentType.Plane));
Assert.That(distance, Is.EqualTo(0.15f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.74f, 0.25f, -1.02f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(Vector3.up).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Y Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsInsideYNeg()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.1f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal);
Assert.That(distance, Is.EqualTo(-0.1f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.74f, 0f, -1.02f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(Vector3.down).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Y Positive plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsInsideYPos()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.4f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal);
Assert.That(distance, Is.EqualTo(-0.1f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.74f, 0.5f, -1.02f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(Vector3.up).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the X Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsInsideXNeg()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(-0.4f, 0.25f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal);
Assert.That(distance, Is.EqualTo(-0.0609238148f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(-0.460909486f, 0.25f, -1.0186826f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(-0.999766171f, 0, 0.0216231868f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the X Positive plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsInsideXPos()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(1.8f, 0.25f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal);
Assert.That(distance, Is.EqualTo(-0.140905142f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(1.94087219f, 0.25f, -1.02304673f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(0.999766171f, 0f, -0.0216231868f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Z Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsInsideZNeg()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.2f, -1.9f), out var surfacePosition, out var closestAnchor, out var normal);
Assert.That(distance, Is.EqualTo(-0.0241975784).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.7394768f, 0.199999988f, -1.92419195f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(-0.0216231868f, 0, -0.999766231f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Z Positive plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsInsideZPos()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.2f, -0.2f), out var surfacePosition, out var closestAnchor, out var normal);
Assert.That(distance, Is.EqualTo(-0.0841835737f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.741820335f, 0.199999988f, -0.115835905f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(0.0216231868f, 0f, 0.999766231f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Y Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsOutsideYNeg()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, -0.1f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH));
Assert.That(distance, Is.EqualTo(0.1f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.74f, 0f, -1.02f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(Vector3.down).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Y Positive plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsOutsideYPos()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.6f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH));
Assert.That(distance, Is.EqualTo(0.1f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.74f, 0.5f, -1.02f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(Vector3.up).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the X Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsOutsideXNeg()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(-0.6f, 0.25f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH));
Assert.That(distance, Is.EqualTo(0.139029458f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(-0.461003065f, 0.25f, -1.0230062f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(-0.999766171f, 0, 0.0216231868f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the X Positive plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsOutsideXPos()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(2.0f, 0.25f, -1.02f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH));
Assert.That(distance, Is.EqualTo(0.0590481535f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(1.94096565f, 0.25f, -1.01872313f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(0.999766171f, 0f, -0.0216231868f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Z Negative plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsOutsideZNeg()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.2f, -2.1f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH));
Assert.That(distance, Is.EqualTo(0.175755471f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.743800402f, 0.199999988f, -1.92428553f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(-0.0216231868f, 0, -0.999766231f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
///
/// Test that the position is inside a volume closest to the Z Positive plane
///
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator ClosestSurfacePosition_Volume_IsOutsideZPos()
{
var distance = _currentRoom.TryGetClosestSurfacePosition(new Vector3(0.74f, 0.2f, 0f), out var surfacePosition, out var closestAnchor, out var normal, new LabelFilter(MRUKAnchor.SceneLabels.COUCH));
Assert.That(distance, Is.EqualTo(0.115769513f).Within(1e-6f));
Assert.That(closestAnchor.Label, Is.EqualTo(MRUKAnchor.SceneLabels.COUCH));
Assert.That(surfacePosition, Is.EqualTo(new Vector3(0.737496674f, 0.200000048f, -0.115742445f)).Using(Vector3EqualityComparer.Instance));
Assert.That(normal, Is.EqualTo(new Vector3(0.0216231868f, 0f, 0.999766231f)).Using(Vector3EqualityComparer.Instance));
yield return null;
}
}
}