Пример #1
0
        /// <summary>
        /// does not drop unused vertices.
        /// </summary>
        public static Mesh CutMeshGeneric2(this Mesh mesh, IsGoodHandler IsGoodFunc)
        {
            List <int> indexList = new List <int>(mesh.vertexCount);

            for (int i = 0; i < indexList.Count; ++i)
            {
                indexList[i] = i;                                       // create linear list
            }
            // add only triangles on the right side.
            var newTriangleList = new List <int>(mesh.triangles.Length);

            for (var i = 0; i < mesh.triangles.Length; i += 3)
            {
                bool IsGood(int _i)
                {
                    var t = mesh.triangles[_i];

                    return(IsGoodFunc(mesh.vertices[t]));
                }

                if (IsGood(i) && IsGood(i + 1) && IsGood(i + 2))
                {
                    //Log.Debug($"Adding triangle[i:i+2]i={i}");
                    newTriangleList.Add(mesh.triangles[i]);
                    newTriangleList.Add(mesh.triangles[i + 1]);
                    newTriangleList.Add(mesh.triangles[i + 2]);
                }
            }

            var newMesh = new Mesh {
                name = mesh.name + "_CutMeshGeneric"
            };

            newMesh.bounds    = mesh.bounds;
            newMesh.vertices  = mesh.vertices.ToArray();
            newMesh.uv        = mesh.uv.ToArray();
            newMesh.normals   = mesh.normals.ToArray();
            newMesh.tangents  = mesh.tangents.ToArray();
            newMesh.triangles = newTriangleList.ToArray(); // triangle must be added after vertices.
            return(newMesh);
        }
Пример #2
0
        public static Mesh CutMeshGeneric(this Mesh mesh, IsGoodHandler IsGoodFunc)
        {
            const int EMPTY = -2;

            #region Calculate triangles and indexes
            var indexArray = new int[mesh.vertexCount];
            for (int i = 0; i < indexArray.Length; ++i)
            {
                bool good = IsGoodFunc(mesh.vertices[i]);
                indexArray[i] = good ? i : EMPTY /*mark for removal*/;
            }
            indexArray = indexArray.Where(v => v != EMPTY).ToArray();

            // create inverse array
            int[] indexArrayInverse = new int[mesh.vertexCount];
            for (int i = 0; i < indexArrayInverse.Length; ++i)
            {
                indexArrayInverse[i] = EMPTY;
            }

            // switch value and index.
            for (int i = 0; i < indexArray.Length; ++i)
            {
                indexArrayInverse[indexArray[i]] = i;
            }

            // update triangle indeces and add only if all their vertices is on the right side.
            var newTriangleList = new List <int>(mesh.triangles.Length);
            for (var i = 0; i < mesh.triangles.Length; i += 3)
            {
                int newTriangle0 = indexArrayInverse[mesh.triangles[i]];
                int newTriangle1 = indexArrayInverse[mesh.triangles[i + 1]];
                int newTriangle2 = indexArrayInverse[mesh.triangles[i + 2]];
                if (newTriangle0 != EMPTY && newTriangle1 != EMPTY && newTriangle2 != EMPTY)
                {
                    newTriangleList.Add(newTriangle0);
                    newTriangleList.Add(newTriangle1);
                    newTriangleList.Add(newTriangle2);
                }
            }
            #endregion

            var newVertices = new Vector3[indexArray.Length];
            var newUV       = new Vector2[indexArray.Length];
            var newNormals  = new Vector3[indexArray.Length];
            var newTangents = new Vector4[indexArray.Length];
            for (int i = 0; i < indexArray.Length; ++i)
            {
                int j = indexArray[i];
                newVertices[i] = mesh.vertices[j];
                newUV[i]       = mesh.uv[i];
                newNormals[i]  = mesh.normals[j];
                newTangents[i] = mesh.tangents[j];
            }
            var newMesh = new Mesh();
            newMesh.bounds    = mesh.bounds;
            newMesh.vertices  = newVertices;
            newMesh.normals   = newNormals;
            newMesh.tangents  = newTangents;
            newMesh.triangles = newTriangleList.ToArray(); // triangle must be added after vertices.
            return(newMesh);
        }