private void RemoveObsoleteVertices(DecalsMesh a_DecalsMesh) { DecalProjectorBase activeDecalProjector = a_DecalsMesh.ActiveDecalProjector; this.m_ObsoleteInternalVertexIndices.Sort(); List <OptimizeEdge> list = this.m_RedundantInternalEdges.OptimizedEdgeList(); for (int i = this.m_ObsoleteInternalVertexIndices.Count - 1; i >= 0; i--) { bool flag; int num2 = this.m_ObsoleteInternalVertexIndices[i]; this.m_ObsoleteVertexRemover.RemoveObsoleteInternalVertex(a_DecalsMesh, num2, list, out flag); if (!flag) { this.m_ObsoleteInternalVertexIndices.RemoveAt(i); } } for (int j = this.m_ObsoleteExternalVertexIndices.Count - 1; j >= 0; j--) { bool flag2; int num4 = this.m_ObsoleteExternalVertexIndices[j]; this.m_ObsoleteVertexRemover.RemoveObsoleteExternalVertex(a_DecalsMesh, num4, out flag2); if (!flag2) { this.m_ObsoleteExternalVertexIndices.RemoveAt(j); } } this.m_ObsoleteInternalVertexIndices.AddRange(this.m_ObsoleteExternalVertexIndices); this.m_ObsoleteInternalVertexIndices.Sort(); foreach (int num5 in this.m_ObsoleteInternalVertexIndices) { this.m_RemovedIndices.AddRemovedIndex(num5); } a_DecalsMesh.RemoveAndAdjustIndices(activeDecalProjector.DecalsMeshLowerTriangleIndex, this.m_RemovedIndices); activeDecalProjector.IsUV1ProjectionCalculated = false; activeDecalProjector.IsUV2ProjectionCalculated = false; activeDecalProjector.IsTangentProjectionCalculated = false; }
private void ComputePotentialObsoleteVertices(DecalsMesh a_DecalsMesh) { DecalProjectorBase activeDecalProjector = a_DecalsMesh.ActiveDecalProjector; this.ClearAll(); for (int i = activeDecalProjector.DecalsMeshLowerTriangleIndex; i <= activeDecalProjector.DecalsMeshUpperTriangleIndex; i += 3) { int num2 = a_DecalsMesh.Triangles[i]; int num3 = a_DecalsMesh.Triangles[i + 1]; int num4 = a_DecalsMesh.Triangles[i + 2]; OptimizeEdge edge = new OptimizeEdge(num2, num3, i); OptimizeEdge edge2 = new OptimizeEdge(num3, num4, i); OptimizeEdge edge3 = new OptimizeEdge(num4, num2, i); this.AddEdge(edge); this.AddEdge(edge2); this.AddEdge(edge3); } List <OptimizeEdge> list = this.m_RedundantExternalEdges.OptimizedEdgeList(); foreach (OptimizeEdge edge4 in list) { if (!this.m_NonInternalVertexIndices.ContainsKey(edge4.vertex1Index)) { this.m_NonInternalVertexIndices.Add(edge4.vertex1Index, edge4.vertex1Index); } if (!this.m_NonInternalVertexIndices.ContainsKey(edge4.vertex2Index)) { this.m_NonInternalVertexIndices.Add(edge4.vertex2Index, edge4.vertex2Index); } } foreach (OptimizeEdge edge5 in this.m_OverusedInternalEdges.OptimizedEdgeList()) { if (!this.m_NonInternalVertexIndices.ContainsKey(edge5.vertex1Index)) { this.m_NonInternalVertexIndices.Add(edge5.vertex1Index, edge5.vertex1Index); } if (!this.m_NonInternalVertexIndices.ContainsKey(edge5.vertex2Index)) { this.m_NonInternalVertexIndices.Add(edge5.vertex2Index, edge5.vertex2Index); } } for (int j = activeDecalProjector.DecalsMeshLowerVertexIndex; j <= activeDecalProjector.DecalsMeshUpperVertexIndex; j++) { if (!this.m_NonInternalVertexIndices.ContainsKey(j)) { this.m_ObsoleteInternalVertexIndices.Add(j); } } int num6 = 0; while (num6 < list.Count) { OptimizeEdge edge6 = list[num6]; int num7 = num6 + 1; while (true) { if (num7 >= this.m_RedundantExternalEdges.Count) { num6++; break; } OptimizeEdge edge7 = list[num7]; if ((edge6.vertex1Index != edge7.vertex1Index) && (edge6.vertex1Index != edge7.vertex2Index)) { if ((((edge6.vertex2Index == edge7.vertex1Index) || (edge6.vertex2Index == edge7.vertex2Index)) && !this.m_ObsoleteExternalVertexIndices.Contains(edge6.vertex2Index)) && AreEdgesParallelOrIsAtLeastOneAPoint(a_DecalsMesh, edge6, edge7)) { this.m_ObsoleteExternalVertexIndices.Add(edge6.vertex2Index); } } else if (!this.m_ObsoleteExternalVertexIndices.Contains(edge6.vertex1Index) && AreEdgesParallelOrIsAtLeastOneAPoint(a_DecalsMesh, edge6, edge7)) { this.m_ObsoleteExternalVertexIndices.Add(edge6.vertex1Index); } num7++; } } this.ClearTemporaryCollections(); }