VR4Medical/ICI/Library/PackageCache/com.unity.xr.openxr@3903c1059bcf/Samples~/MeshingFeature/MeshingBehaviour.cs
2025-07-29 13:45:50 +03:00

87 lines
3.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SubsystemsImplementation;
using UnityEngine.XR;
namespace UnityEngine.XR.OpenXR.Samples.MeshingFeature
{
public class MeshingBehaviour : MonoBehaviour
{
public GameObject emptyMeshPrefab;
public TextMesh textMesh;
public Transform target;
private XRMeshSubsystem s_MeshSubsystem;
private List<MeshInfo> s_MeshInfos = new List<MeshInfo>();
private Dictionary<MeshId, GameObject> m_MeshIdToGo = new Dictionary<MeshId, GameObject>();
void Start()
{
var feature = OpenXRSettings.Instance.GetFeature<MeshingTeapotFeature>();
if (null == feature || feature.enabled == false)
{
enabled = false;
return;
}
var meshSubsystems = new List<XRMeshSubsystem>();
SubsystemManager.GetSubsystems(meshSubsystems);
if (meshSubsystems.Count == 1)
{
s_MeshSubsystem = meshSubsystems[0];
textMesh.gameObject.SetActive(false);
}
else
{
#if UNITY_EDITOR
textMesh.text = "Failed to initialize MeshSubsystem.\nTry reloading the Unity Editor";
#else
textMesh.text = "Failed to initialize MeshSubsystem.";
#endif
enabled = false;
}
}
void Update()
{
if (s_MeshSubsystem.running && s_MeshSubsystem.TryGetMeshInfos(s_MeshInfos))
{
foreach (var meshInfo in s_MeshInfos)
{
switch (meshInfo.ChangeState)
{
case MeshChangeState.Added:
case MeshChangeState.Updated:
if (!m_MeshIdToGo.TryGetValue(meshInfo.MeshId, out var go))
{
go = Instantiate(emptyMeshPrefab, target, false);
m_MeshIdToGo[meshInfo.MeshId] = go;
}
var mesh = go.GetComponent<MeshFilter>().mesh;
var col = go.GetComponent<MeshCollider>();
s_MeshSubsystem.GenerateMeshAsync(meshInfo.MeshId, mesh, col, MeshVertexAttributes.Normals | MeshVertexAttributes.UVs,
result =>
{
Debug.Log("Mesh generated: " + result.Status);
});
break;
case MeshChangeState.Removed:
if (m_MeshIdToGo.TryGetValue(meshInfo.MeshId, out var meshGo))
{
Destroy(meshGo);
m_MeshIdToGo.Remove(meshInfo.MeshId);
}
break;
default:
break;
}
}
}
}
}
}