private void OutputPolymesh(ElementType elementType, int polySize) { MeshUtils.Vertex v; MeshUtils.Face f; MeshUtils.Edge edge; int maxFaceCount = 0; int maxVertexCount = 0; int faceVerts, i; if (polySize < 3) { polySize = 3; } // Assume that the input data is triangles now. // Try to merge as many polygons as possible if (polySize > 3) { _mesh.MergeConvexFaces(_pool, polySize); } // Mark unused for (v = _mesh._vHead._next; v != _mesh._vHead; v = v._next) { v._n = Undef; } // Create unique IDs for all vertices and faces. for (f = _mesh._fHead._next; f != _mesh._fHead; f = f._next) { f._n = Undef; if (!f._inside) { continue; } if (NoEmptyPolygons) { var area = MeshUtils.FaceArea(f); if (DeterministicFloat.Abs(area) < DeterministicFloat.Epsilon) { continue; } } edge = f._anEdge; faceVerts = 0; do { v = edge._Org; if (v._n == Undef) { v._n = maxVertexCount; maxVertexCount++; } faceVerts++; edge = edge._Lnext; }while (edge != f._anEdge); Debug.Assert(faceVerts <= polySize); f._n = maxFaceCount; ++maxFaceCount; } _elementCount = maxFaceCount; if (elementType == ElementType.ConnectedPolygons) { maxFaceCount *= 2; } _elements = new int[maxFaceCount * polySize]; _vertexCount = maxVertexCount; _vertices = new ContourVertex[_vertexCount]; // Output vertices. for (v = _mesh._vHead._next; v != _mesh._vHead; v = v._next) { if (v._n != Undef) { // Store coordinate _vertices[v._n].Position = v._coords; _vertices[v._n].Data = v._data; } } // Output indices. int elementIndex = 0; for (f = _mesh._fHead._next; f != _mesh._fHead; f = f._next) { if (!f._inside) { continue; } if (NoEmptyPolygons) { var area = MeshUtils.FaceArea(f); if (DeterministicFloat.Abs(area) < DeterministicFloat.Epsilon) { continue; } } // Store polygon edge = f._anEdge; faceVerts = 0; do { v = edge._Org; _elements[elementIndex++] = v._n; faceVerts++; edge = edge._Lnext; } while (edge != f._anEdge); // Fill unused. for (i = faceVerts; i < polySize; ++i) { _elements[elementIndex++] = Undef; } // Store polygon connectivity if (elementType == ElementType.ConnectedPolygons) { edge = f._anEdge; do { _elements[elementIndex++] = GetNeighbourFace(edge); edge = edge._Lnext; } while (edge != f._anEdge); // Fill unused. for (i = faceVerts; i < polySize; ++i) { _elements[elementIndex++] = Undef; } } } }
private void OutputPolymesh(ElementType elementType, int polySize) { int num = 0; int num2 = 0; if (polySize < 3) { polySize = 3; } if (polySize > 3) { _mesh.MergeConvexFaces(polySize); } for (MeshUtils.Vertex next = _mesh._vHead._next; next != _mesh._vHead; next = next._next) { next._n = -1; } for (MeshUtils.Face next2 = _mesh._fHead._next; next2 != _mesh._fHead; next2 = next2._next) { next2._n = -1; if (next2._inside && (!NoEmptyPolygons || !(Math.Abs(MeshUtils.FaceArea(next2)) < 1.401298E-45f))) { MeshUtils.Edge edge = next2._anEdge; int num3 = 0; do { MeshUtils.Vertex next = edge._Org; if (next._n == -1) { next._n = num2; num2++; } num3++; edge = edge._Lnext; }while (edge != next2._anEdge); next2._n = num; num++; } } _elementCount = num; if (elementType == ElementType.ConnectedPolygons) { num *= 2; } _elements = new int[num * polySize]; _vertexCount = num2; _vertices = new ContourVertex[_vertexCount]; for (MeshUtils.Vertex next = _mesh._vHead._next; next != _mesh._vHead; next = next._next) { if (next._n != -1) { _vertices[next._n].Position = next._coords; _vertices[next._n].Data = next._data; } } int num4 = 0; for (MeshUtils.Face next2 = _mesh._fHead._next; next2 != _mesh._fHead; next2 = next2._next) { if (next2._inside && (!NoEmptyPolygons || !(Math.Abs(MeshUtils.FaceArea(next2)) < 1.401298E-45f))) { MeshUtils.Edge edge = next2._anEdge; int num3 = 0; do { MeshUtils.Vertex next = edge._Org; _elements[num4++] = next._n; num3++; edge = edge._Lnext; }while (edge != next2._anEdge); for (int i = num3; i < polySize; i++) { _elements[num4++] = -1; } if (elementType == ElementType.ConnectedPolygons) { edge = next2._anEdge; do { _elements[num4++] = GetNeighbourFace(edge); edge = edge._Lnext; }while (edge != next2._anEdge); for (int i = num3; i < polySize; i++) { _elements[num4++] = -1; } } } } }