MergeConvexFaces() public method

public MergeConvexFaces ( int maxVertsPerFace ) : void
maxVertsPerFace int
return void
Exemplo n.º 1
0
        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;
                    }
                }
            }
        }
Exemplo n.º 2
0
        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;
                        }
                    }
                }
            }
        }