private bool TriangleContainsVertexInList(int indexPrev, int indexCurr, int indexNext, NativeLinkedList <int> list)
        {
            for (NativeLinkedList <int> .Enumerator currIndexNode = list.Head; currIndexNode.IsValid; currIndexNode.MoveNext())
            {
                NativeLinkedList <int> .Enumerator prevIndexNode = (currIndexNode.Prev.IsValid) ? currIndexNode.Prev : list.Tail;
                NativeLinkedList <int> .Enumerator nextIndexNode = (currIndexNode.Next.IsValid) ? currIndexNode.Next : list.Head;

                bool isCurrentConvex = Math2DUtils.IsVertexConvex(Polygon[prevIndexNode.Value], Polygon[currIndexNode.Value], Polygon[nextIndexNode.Value], true);
                if (isCurrentConvex)
                {
                    continue;
                }

                int currIndexToCheck = currIndexNode.Value;
                if (currIndexToCheck == indexPrev || currIndexToCheck == indexCurr || currIndexToCheck == indexNext)
                {
                    continue;
                }

                if (Math2DUtils.IsInsideTriangle(Polygon[currIndexToCheck], Polygon[indexPrev], Polygon[indexCurr], Polygon[indexNext]))
                {
                    return(true);
                }
            }
            return(false);
        }
        private void Triangulate(int polygonIndex, NativeLinkedList <int> list)
        {
            int trisIndex = 0;

            for (int pi = 0; pi < polygonIndex; ++pi)
            {
                trisIndex += Polygons.GetPolygonHolesNum(pi) * 2 + Polygons.GetPolygonNumVertices(pi) - 2;
            }
            trisIndex *= 3;

            while (list.Length > 2)
            {
                bool hasRemovedEar = false;

                int currListIndex = 0;
                NativeLinkedList <int> .Enumerator currIndexNode = list.Head;
                for (int i = 0; i < list.Length; ++i)
                {
                    NativeLinkedList <int> .Enumerator prevIndexNode = (currIndexNode.Prev.IsValid) ? currIndexNode.Prev : list.Tail;
                    NativeLinkedList <int> .Enumerator nextIndexNode = (currIndexNode.Next.IsValid) ? currIndexNode.Next : list.Head;

                    bool isCurrentConvex = Math2DUtils.IsVertexConvex(Polygons[prevIndexNode.Value], Polygons[currIndexNode.Value], Polygons[nextIndexNode.Value], true);
                    if (isCurrentConvex)
                    {
                        bool triangleContainsAVertex = TriangleContainsVertexInList(prevIndexNode.Value, currIndexNode.Value, nextIndexNode.Value, list);
                        if (!triangleContainsAVertex)
                        {
                            OutTriangles[trisIndex]     = nextIndexNode.Value;
                            OutTriangles[trisIndex + 1] = currIndexNode.Value;
                            OutTriangles[trisIndex + 2] = prevIndexNode.Value;
                            trisIndex += 3;

                            list.Remove(currIndexNode);

                            hasRemovedEar = true;
                            break;
                        }
                    }

                    currListIndex = (currListIndex + 1) % list.Length;
                    currIndexNode = list.GetEnumeratorAtIndex(currListIndex);
                }

                if (!hasRemovedEar)
                {
                    return;
                }
            }
        }