Exemplo n.º 1
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, 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);
        }