/// <summary>
 /// Clears out all sub-meshes.
 /// </summary>
 public void ClearSubMeshes()
 {
     subMeshCount = 0;
     triangles.Resize(0);
 }
        /// <summary>
        /// Remove vertices and mark deleted triangles
        /// </summary>
        private void RemoveVertexPass(int startTrisCount, int targetTrisCount, double threshold, ResizableArray <bool> deleted0, ResizableArray <bool> deleted1, ref int deletedTris)
        {
            var triangles     = this.triangles.Data;
            int triangleCount = this.triangles.Length;
            var vertices      = this.vertices.Data;

            Vertex   v0, v1;
            Vector3d p;

            for (int i = 0; i < triangleCount; i++)
            {
                var t = triangles[i];
                if (t.dirty || t.deleted || t.err3 > threshold)
                {
                    continue;
                }

                t.GetErrors(errArr);
                for (int j = 0; j < 3; j++)
                {
                    if (errArr[j] > threshold)
                    {
                        continue;
                    }

                    int i0 = t[j];
                    int i1 = t[(j + 1) % 3];
                    v0 = vertices[i0];
                    v1 = vertices[i1];

                    // Border check
                    if (v0.border != v1.border)
                    {
                        continue;
                    }

                    // If borders should be kept
                    if (keepBorders && (v0.border || v1.border))
                    {
                        continue;
                    }

                    // Compute vertex to collapse to
                    CalculateError(i0, i1, out p);
                    deleted0.Resize(v0.tcount); // normals temporarily
                    deleted1.Resize(v1.tcount); // normals temporarily

                    // Don't remove if flipped
                    if (Flipped(p, i0, i1, ref v0, deleted0))
                    {
                        continue;
                    }
                    if (Flipped(p, i1, i0, ref v1, deleted1))
                    {
                        continue;
                    }

                    // Not flipped, so remove edge
                    v0.p         = p;
                    v0.q        += v1.q;
                    vertices[i0] = v0;
                    MergeVertices(i0, i1);

                    int tstart = refs.Length;
                    UpdateTriangles(i0, ref v0, deleted0, ref deletedTris);
                    UpdateTriangles(i0, ref v1, deleted1, ref deletedTris);

                    int tcount = refs.Length - tstart;
                    if (tcount <= v0.tcount)
                    {
                        // save ram
                        if (tcount > 0)
                        {
                            var refsArr = refs.Data;
                            Array.Copy(refsArr, tstart, refsArr, v0.tstart, tcount);
                        }
                    }
                    else
                    {
                        // append
                        vertices[i0].tstart = tstart;
                    }

                    vertices[i0].tcount = tcount;
                    break;
                }

                // Check if we are already done
                if ((startTrisCount - deletedTris) <= targetTrisCount)
                {
                    break;
                }
            }
        }
Esempio n. 3
0
 public void Resize(int length, bool trimExess = false)
 {
     deltaVertices.Resize(length, trimExess);
     deltaNormals.Resize(length, trimExess);
     deltaTangents.Resize(length, trimExess);
 }