static int GetEqualHullForEdges(NativeArray <TessEdge> edges, TessEdge p)
            {
                int             l   = 0;
                int             h   = edges.Length - 1;
                TessEdgeCompare tec = new TessEdgeCompare();

                while (l <= h)
                {
                    int m;
                    m = ((int)(l + h)) >> 1;
                    int f = tec.Compare(edges[m], p);
                    if (f == 0)
                    {
                        return(m);
                    }
                    else if (f <= 0)
                    {
                        l = m + 1;
                    }
                    else
                    {
                        h = m - 1;
                    }
                }

                return(-1);
            }
            void Prepare(NativeArray <TessEdge> edgesIn)
            {
                m_Stars = new NativeArray <TessStar>(edgesIn.Length, Allocator.Temp);

                for (int i = 0; i < edgesIn.Length; ++i)
                {
                    TessEdge e = edgesIn[i];
                    e.a        = (edgesIn[i].a < edgesIn[i].b) ? edgesIn[i].a : edgesIn[i].b;
                    e.b        = (edgesIn[i].a > edgesIn[i].b) ? edgesIn[i].a : edgesIn[i].b;
                    edgesIn[i] = e;
                    TessStar s = m_Stars[i];
                    s.points     = new ArraySlice <int>(m_SPArray, i * m_StarCount, m_StarCount);
                    s.pointCount = 0;
                    m_Stars[i]   = s;
                }

                unsafe
                {
                    TessUtils.InsertionSort <TessEdge, TessEdgeCompare>(
                        NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(edgesIn), 0, edgesIn.Length - 1,
                        new TessEdgeCompare());
                }

                m_Edges = new NativeArray <TessEdge>(edgesIn.Length, Allocator.Temp);
                m_Edges.CopyFrom(edgesIn);

                // Fill stars.
                for (int i = 0; i < m_CellCount; ++i)
                {
                    int      a  = m_Cells[i].a;
                    int      b  = m_Cells[i].b;
                    int      c  = m_Cells[i].c;
                    TessStar sa = m_Stars[a];
                    TessStar sb = m_Stars[b];
                    TessStar sc = m_Stars[c];
                    sa.points[sa.pointCount++] = b;
                    sa.points[sa.pointCount++] = c;
                    sb.points[sb.pointCount++] = c;
                    sb.points[sb.pointCount++] = a;
                    sc.points[sc.pointCount++] = a;
                    sc.points[sc.pointCount++] = b;
                    m_Stars[a] = sa;
                    m_Stars[b] = sb;
                    m_Stars[c] = sc;
                }
            }
            internal void Triangulate(NativeArray <float2> points, NativeArray <TessEdge> edgesIn)
            {
                int       numEdges   = edgesIn.Length;
                const int kStarEdges = 16;

                m_NumPoints = points.Length;
                m_StarCount = m_NumPoints > kStarEdges ? m_NumPoints : kStarEdges;
                m_StarCount = m_StarCount * 2;
                m_CellCount = 0;
                m_Cells     = new NativeArray <TessCell>(m_NumPoints * (m_NumPoints + 1), Allocator.Temp);
                m_ILArray   = new NativeArray <int>(m_NumPoints * (m_NumPoints + 1), Allocator.Temp); // Make room for -1 node.
                m_IUArray   = new NativeArray <int>(m_NumPoints * (m_NumPoints + 1), Allocator.Temp); // Make room for -1 node.
                m_SPArray   = new NativeArray <int>(m_NumPoints * (m_StarCount), Allocator.Temp);     // Make room for -1 node.

                NativeArray <TessHull> hulls = new NativeArray <TessHull>(m_NumPoints * 8, Allocator.Temp);
                int hullCount = 0;

                NativeArray <TessEvent> events = new NativeArray <TessEvent>(m_NumPoints + (numEdges * 2), Allocator.Temp);
                int eventCount = 0;

                for (int i = 0; i < m_NumPoints; ++i)
                {
                    TessEvent evt = new TessEvent();
                    evt.a                = points[i];
                    evt.b                = new float2();
                    evt.idx              = i;
                    evt.type             = (int)TessEventType.EVENT_POINT;
                    events[eventCount++] = evt;
                }

                for (int i = 0; i < numEdges; ++i)
                {
                    TessEdge e = edgesIn[i];
                    float2   a = points[e.a];
                    float2   b = points[e.b];
                    if (a.x < b.x)
                    {
                        TessEvent _s = new TessEvent();
                        _s.a    = a;
                        _s.b    = b;
                        _s.idx  = i;
                        _s.type = (int)TessEventType.EVENT_START;

                        TessEvent _e = new TessEvent();
                        _e.a    = b;
                        _e.b    = a;
                        _e.idx  = i;
                        _e.type = (int)TessEventType.EVENT_END;

                        events[eventCount++] = _s;
                        events[eventCount++] = _e;
                    }
                    else if (a.x > b.x)
                    {
                        TessEvent _s = new TessEvent();
                        _s.a    = b;
                        _s.b    = a;
                        _s.idx  = i;
                        _s.type = (int)TessEventType.EVENT_START;

                        TessEvent _e = new TessEvent();
                        _e.a    = a;
                        _e.b    = b;
                        _e.idx  = i;
                        _e.type = (int)TessEventType.EVENT_END;

                        events[eventCount++] = _s;
                        events[eventCount++] = _e;
                    }
                }

                unsafe
                {
                    TessUtils.InsertionSort <TessEvent, TessEventCompare>(
                        NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(events), 0, eventCount - 1,
                        new TessEventCompare());
                    ;
                }

                float    minX = events[0].a.x - (1 + math.abs(events[0].a.x)) * math.pow(2.0f, -16.0f);
                TessHull hull;

                hull.a.x           = minX;
                hull.a.y           = 1;
                hull.b.x           = minX;
                hull.b.y           = 0;
                hull.idx           = -1;
                hull.ilarray       = new ArraySlice <int>(m_ILArray, m_NumPoints * m_NumPoints, m_NumPoints); // Last element
                hull.iuarray       = new ArraySlice <int>(m_IUArray, m_NumPoints * m_NumPoints, m_NumPoints);
                hull.ilcount       = 0;
                hull.iucount       = 0;
                hulls[hullCount++] = hull;

                for (int i = 0, numEvents = eventCount; i < numEvents; ++i)
                {
                    switch (events[i].type)
                    {
                    case (int)TessEventType.EVENT_POINT:
                    {
                        AddPoint(hulls, hullCount, points, events[i].a, events[i].idx);
                    }
                    break;

                    case (int)TessEventType.EVENT_START:
                    {
                        SplitHulls(hulls, ref hullCount, points, events[i]);
                    }
                    break;

                    default:
                    {
                        MergeHulls(hulls, ref hullCount, points, events[i]);
                    }
                    break;
                    }
                }

                hulls.Dispose();
                events.Dispose();
            }