VR4RoboticArm2/VR4RoboticArm/Library/PackageCache/com.meta.xr.mrutilitykit/Tests/PlayMode/EffectMeshTests.cs
IonutMocanu d7aba243a2 Main
2025-09-08 11:04:02 +03:00

416 lines
14 KiB
C#

/*
* 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 System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TestTools;
using Object = UnityEngine.Object;
namespace Meta.XR.MRUtilityKit.Tests
{
public class EffectMeshTests : MRUKTestBase
{
private MRUKRoom _currentRoom;
private JSONTestHelper _jsonTestHelper;
private static int Room1VertCountWall = 4;
private static int Room1VertCountFloor = 8;
private static int Room1VertCountCeiling = 8;
private static int Room1VertCountTable = 24;
private static int Room1VertCountOther = 24;
[UnitySetUp]
public IEnumerator SetUp()
{
yield return LoadScene("Packages/com.meta.xr.mrutilitykit/Tests/EffectMeshTests.unity");
_jsonTestHelper = Object.FindAnyObjectByType<JSONTestHelper>();
}
[UnityTearDown]
public IEnumerator TearDown()
{
DestroyAll();
yield return UnloadScene();
}
private int GetRoom1Vertices()
{
return 7 * Room1VertCountWall
+ Room1VertCountFloor
+ Room1VertCountCeiling
+ Room1VertCountTable
+ 2 * Room1VertCountOther;
}
private int GetRoom1VerticesMoreAnchors()
{
return 7 * Room1VertCountWall
+ Room1VertCountFloor
+ Room1VertCountCeiling
+ Room1VertCountTable
+ 4 * Room1VertCountOther;
}
private int GetRoom1Room3Vertices()
{
return 7 * Room1VertCountWall //room1
+ Room1VertCountFloor
+ Room1VertCountCeiling
+ Room1VertCountTable
+ 2 * Room1VertCountOther
+ 7 * Room1VertCountWall //room3
+ Room1VertCountFloor
+ Room1VertCountCeiling
+ Room1VertCountTable
+ 2 * Room1VertCountOther;
}
private int GetDefaultRoomVertices()
{
return 7 * Room1VertCountWall
+ Room1VertCountFloor
+ Room1VertCountCeiling;
}
/// <summary>
/// This function tests the count of vertices for each anchor in a scene.
/// It iterates over each room and anchor, and asserts that the count of vertices matches the expected count based on the anchor's label.
/// </summary>
/// <returns></returns>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountVertsFromObjectsInSequenceWithChildren()
{
SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom3Room1.text);
foreach (var room in MRUK.Instance.Rooms)
{
foreach (var anchor in room.Anchors)
{
switch (anchor.Label)
{
case MRUKAnchor.SceneLabels.FLOOR:
Assert.AreEqual(Room1VertCountFloor, CountVertex(anchor));
break;
case MRUKAnchor.SceneLabels.CEILING:
Assert.AreEqual(Room1VertCountCeiling, CountVertex(anchor));
break;
case MRUKAnchor.SceneLabels.DOOR_FRAME:
case MRUKAnchor.SceneLabels.WINDOW_FRAME:
case MRUKAnchor.SceneLabels.SCREEN:
case MRUKAnchor.SceneLabels.WALL_ART:
case MRUKAnchor.SceneLabels.INVISIBLE_WALL_FACE:
case MRUKAnchor.SceneLabels.WALL_FACE:
Assert.AreEqual(Room1VertCountWall, CountVertex(anchor));
break;
case MRUKAnchor.SceneLabels.STORAGE:
case MRUKAnchor.SceneLabels.BED:
case MRUKAnchor.SceneLabels.TABLE:
case MRUKAnchor.SceneLabels.COUCH:
case MRUKAnchor.SceneLabels.PLANT:
case MRUKAnchor.SceneLabels.LAMP:
case MRUKAnchor.SceneLabels.OTHER:
Assert.AreEqual(Room1VertCountOther, CountVertex(anchor));
break;
case MRUKAnchor.SceneLabels.GLOBAL_MESH:
break;
}
}
}
yield return null;
}
/// <summary>
/// This function tests the vertex count in a default room with no anchors.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesDefaultRoomNoAnchors()
{
SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.DefaultRoomNoAnchors.text);
var vertCount = CountVertex();
var expectedVerts = GetDefaultRoomVertices();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
/// <summary>
/// This function tests the vertex count in a default room with anchors.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesRoom1WithAnchors()
{
SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1.text);
var vertCount = CountVertex();
var expectedVerts = GetRoom1Vertices();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
/// <summary>
/// This function tests the vertex count in a room1 after room3 got removed.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesRoom3Removed()
{
var effectMesh = SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom3Room1.text);
var vertCount = CountVertex();
var expectedVerts = GetRoom1Room3Vertices();
Assert.AreEqual(expectedVerts, vertCount);
//track room updates, we want just vertices of Room one for this test
effectMesh.TrackUpdates = true;
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1.text);
vertCount = CountVertex();
expectedVerts = GetRoom1Vertices();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
/// <summary>
/// This function tests the vertex count in room1 after anchors got added.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesRoom1AddedRoomByUser()
{
var effectMesh = SetupEffectMesh();
//we just track one room, and we simulate an added room by the user
effectMesh.SpawnOnStart = MRUK.RoomFilter.CurrentRoomOnly;
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1.text);
var vertCount = CountVertex();
var expectedVerts = GetRoom1Vertices();
Assert.AreEqual(expectedVerts, vertCount);
effectMesh.SpawnOnStart = MRUK.RoomFilter.None;
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom3Room1.text);
_currentRoom = MRUK.Instance.GetCurrentRoom();
List<MRUKRoom> manualCreateEffectMesh = new();
foreach (var room in MRUK.Instance.Rooms)
{
bool foundRoom = false;
foreach (var anchor in room.Anchors)
{
if (!anchor.GetComponentInChildren<Renderer>())
{
manualCreateEffectMesh.Add(room);
foundRoom = true;
break;
}
}
if (foundRoom)
{
break;
}
}
Assert.AreEqual(1, manualCreateEffectMesh.Count);
foreach (var room in manualCreateEffectMesh)
{
effectMesh.CreateMesh(room);
yield return null;
}
vertCount = CountVertex();
expectedVerts = GetRoom1Room3Vertices();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
/// <summary>
/// This function tests the vertex count in room1 after anchors got added manually.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesRoom1AddedAnchorsByUser()
{
var effectMesh = SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1.text);
var vertCount = CountVertex();
var expectedVerts = GetRoom1Vertices();
Assert.AreEqual(expectedVerts, vertCount);
effectMesh.gameObject.SetActive(false);
effectMesh.TrackUpdates = false;
effectMesh.SpawnOnStart = MRUK.RoomFilter.None;
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1MoreAnchors.text);
effectMesh.gameObject.SetActive(true);
_currentRoom = MRUK.Instance.GetCurrentRoom();
List<MRUKAnchor> manualCreateEffectMesh = new();
foreach (var anchor in _currentRoom.Anchors)
{
if (!anchor.GetComponentInChildren<Renderer>())
{
manualCreateEffectMesh.Add(anchor);
}
}
Assert.AreEqual(2, manualCreateEffectMesh.Count);
foreach (var anchor in manualCreateEffectMesh)
{
effectMesh.CreateEffectMesh(anchor);
yield return null;
}
vertCount = CountVertex();
expectedVerts = GetRoom1VerticesMoreAnchors();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
/// <summary>
/// This function tests the vertex count in room1 after anchors got added by an update.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesRoom1AddedAnchorsBySystem()
{
SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1.text);
var vertCount = CountVertex();
var expectedVerts = GetRoom1Vertices();
Assert.AreEqual(expectedVerts, vertCount);
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom1MoreAnchors.text);
vertCount = CountVertex();
expectedVerts = GetRoom1VerticesMoreAnchors();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
/// <summary>
/// This function tests the vertex count in room1 and room3 at startup.
/// </summary>
[UnityTest]
[Timeout(DefaultTimeoutMs)]
public IEnumerator CountTrianglesRoom1Room3Startup()
{
SetupEffectMesh();
yield return LoadSceneFromJsonStringAndWait(_jsonTestHelper.SceneWithRoom3Room1.text);
var vertCount = CountVertex();
var expectedVerts = GetRoom1Room3Vertices();
Assert.AreEqual(expectedVerts, vertCount);
yield return null;
}
private int CountVertex()
{
var effectMesh = Object.FindAnyObjectByType<EffectMesh>();
int vertCount = 0;
foreach (var values in effectMesh.EffectMeshObjects.Values)
{
vertCount += values.mesh.vertexCount;
}
return vertCount;
}
private int CountVertex(MRUKAnchor anchor)
{
var effectMesh = Object.FindAnyObjectByType<EffectMesh>();
var effectMeshObject = effectMesh.EffectMeshObjects[anchor];
return effectMeshObject.mesh.vertexCount;
}
private EffectMesh SetupEffectMesh()
{
var effectMesh = Object.FindAnyObjectByType<EffectMesh>();
if (effectMesh == null)
{
Assert.Fail();
}
effectMesh.SpawnOnStart = MRUK.RoomFilter.AllRooms;
effectMesh.TrackUpdates = true;
return effectMesh;
}
private void DestroyAll()
{
DestroyAll<MeshRenderer>();
DestroyAll<MeshFilter>();
DestroyAll<EffectMesh>();
DestroyAll<MRUKAnchor>();
DestroyAll<MRUKRoom>();
}
private void DestroyAll<T>() where T : Component
{
var allObjects = Object.FindObjectsByType<T>(FindObjectsInactive.Include, FindObjectsSortMode.None);
foreach (var obj in allObjects)
{
Object.DestroyImmediate(obj.gameObject);
}
}
}
}