/// <summary> /// Given a base mesh, the face classifications for all faces in the mesh, and a single face classification to /// extract, extract into a new mesh only the faces that have the selected face classification. /// </summary> /// <param name="baseMesh">The original base mesh.</param> /// <param name="faceClassifications">The array of face classifications for each triangle in the /// <paramref name="baseMesh"/></param> /// <param name="selectedMeshClassification">A single classification to extract the faces from the /// <paramref="baseMesh"/>into the <paramref name="classifiedMesh"/></param> /// <param name="classifiedMesh">The output mesh to be updated with the extracted mesh.</param> void ExtractClassifiedMesh(Mesh baseMesh, NativeArray <ARMeshClassification> faceClassifications, ARMeshClassification selectedMeshClassification, Mesh classifiedMesh) { // Count the number of faces matching the selected classification. int classifiedFaceCount = 0; for (int i = 0; i < faceClassifications.Length; ++i) { if (faceClassifications[i] == selectedMeshClassification) { ++classifiedFaceCount; } } // Clear the existing mesh. classifiedMesh.Clear(); // If there were matching face classifications, build a new mesh from the base mesh. if (classifiedFaceCount > 0) { baseMesh.GetTriangles(m_BaseTriangles, 0); Debug.Assert(m_BaseTriangles.Count == (faceClassifications.Length * 3), "unexpected mismatch between triangle count and face classification count"); m_ClassifiedTriangles.Clear(); m_ClassifiedTriangles.Capacity = classifiedFaceCount * 3; for (int i = 0; i < faceClassifications.Length; ++i) { if (faceClassifications[i] == selectedMeshClassification) { int baseTriangleIndex = i * 3; m_ClassifiedTriangles.Add(m_BaseTriangles[baseTriangleIndex + 0]); m_ClassifiedTriangles.Add(m_BaseTriangles[baseTriangleIndex + 1]); m_ClassifiedTriangles.Add(m_BaseTriangles[baseTriangleIndex + 2]); } } classifiedMesh.vertices = baseMesh.vertices; classifiedMesh.normals = baseMesh.normals; classifiedMesh.SetTriangles(m_ClassifiedTriangles, 0); } }
/// <summary> /// Given a base mesh, the face classifications for all faces in the mesh, and a single face classification to /// extract, extract into a new mesh only the faces that have the selected face classification. /// </summary> /// <param name="baseMesh">The original base mesh.</param> /// <param name="faceClassifications">The array of face classifications for each triangle in the /// <paramref name="baseMesh"/></param> /// <param name="selectedMeshClassification">A single classification to extract the faces from the /// <paramref="baseMesh"/>into the <paramref name="classifiedMesh"/></param> /// <param name="classifiedMesh">The output mesh to be updated with the extracted mesh.</param> void ExtractClassifiedMesh(Mesh baseMesh, List <ARMeshClassification> faceClassifications, ARMeshClassification selectedMeshClassification, Mesh classifiedMesh) { // Count the number of faces matching the selected classification. int classifiedFaceCount = 0; foreach (var faceClassification in faceClassifications) { if (faceClassification == selectedMeshClassification) { ++classifiedFaceCount; } } classifiedMesh.Clear(); if (classifiedFaceCount <= 0) { return; } baseMesh.GetTriangles(m_BaseTriangles, 0); Debug.Assert(m_BaseTriangles.Count == (faceClassifications.Count * 3), "unexpected mismatch between triangle count and face classification count"); m_ClassifiedTriangles.Clear(); m_ClassifiedTriangles.Capacity = classifiedFaceCount * 3; for (int i = 0; i < faceClassifications.Count(); ++i) { if (faceClassifications[i] != selectedMeshClassification) { continue; } int baseTriangleIndex = i * 3; m_ClassifiedTriangles.Add(m_BaseTriangles[baseTriangleIndex + 0]); m_ClassifiedTriangles.Add(m_BaseTriangles[baseTriangleIndex + 1]); m_ClassifiedTriangles.Add(m_BaseTriangles[baseTriangleIndex + 2]); } classifiedMesh.vertices = baseMesh.vertices; classifiedMesh.normals = baseMesh.normals; classifiedMesh.SetTriangles(m_ClassifiedTriangles, 0); }