/// <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; } } }
public void Resize(int length, bool trimExess = false) { deltaVertices.Resize(length, trimExess); deltaNormals.Resize(length, trimExess); deltaTangents.Resize(length, trimExess); }