예제 #1
0
        public void GetVertices(Vector3[] vertices, Vector3[] normals, float accuracy, float offsetX, float offsetY, float scale, ref int index, List <int> contourStarts)
        {
            // We need to know where index starts at:
            int offset = index;

            // Next, we must consider all extra points caused by curves:
            VectorPoint current = FirstPathNode;

            if (current != null)
            {
                contourStarts.Add(0);
            }

            while (current != null)
            {
                if (current.IsCurve)
                {
                    // It's a curve - get the line length:
                    VectorLine line = current as VectorLine;

                    float length = line.Length;

                    int count = (int)(length / accuracy);

                    if (count > 0)
                    {
                        float deltaC = 1f / (count + 1);
                        float c      = deltaC;

                        for (int i = 0; i < count; i++)
                        {
                            // Read curve at c:
                            float x;
                            float y;

                            line.SampleAt(c, out x, out y);

                            vertices[index] = new Vector3(offsetX + (x * scale), offsetY + (y * scale), 0f);
                            //normals[index]=new Vector3(current.NormalX,current.NormalY,0f);
                            index++;

                            c += deltaC;
                        }
                    }
                }

                if (current.IsClose)
                {
                    // Immediately following current is the next first node, if it exists.
                    if (current.Next != null)
                    {
                        // Great, add it:
                        contourStarts.Add(index - offset);
                    }
                }
                else
                {
                    vertices[index] = new Vector3(offsetX + (current.X * scale), offsetY + (current.Y * scale), 0f);

                    //normals[index]=new Vector3(current.NormalX,current.NormalY,0f);

                    index++;
                }

                // Hop to the next one:
                current = current.Next;
            }
        }
예제 #2
0
        /// <summary>Converts this path to straight lines only.
        /// Accuracy is the approx average length of each line segment.</summary>
        public void ToStraightLines(float accuracy)
        {
            if (Width == 0f)
            {
                // Calc lengths etc:
                RecalculateBounds();
            }

            MoveToPoint prevMoveTo = null;
            VectorPoint point      = FirstPathNode;

            while (point != null)
            {
                // If it's straight/ a MoveTo, skip:
                if (point.IsCurve)
                {
                    VectorLine line = point as VectorLine;

                    // Replace it with n line segments:
                    int segmentCount = (int)(line.Length / accuracy);

                    if (segmentCount < 1)
                    {
                        segmentCount = 1;
                    }

                    // Setup:
                    float delta    = 1f / (float)segmentCount;
                    float progress = delta;

                    // Sample it segmentCount times:
                    VectorPoint previous = point.Previous;

                    for (int i = 0; i < segmentCount; i++)
                    {
                        float x;
                        float y;
                        line.SampleAt(progress, out x, out y);

                        // Create line segment:
                        StraightLinePoint slp = new StraightLinePoint(x, y);
                        slp.Previous = previous;

                        if (previous == null)
                        {
                            FirstPathNode = slp;
                        }
                        else
                        {
                            previous.Next = slp;
                        }

                        previous  = slp;
                        progress += delta;
                    }

                    // Increase node count:
                    PathNodeCount += segmentCount - 1;

                    // Link up after too:
                    if (point.Next == null)
                    {
                        LatestPathNode = previous;
                    }
                    else
                    {
                        point.Next.Previous = previous;
                    }

                    if (point.IsClose)
                    {
                        previous.IsClose = true;

                        if (prevMoveTo != null)
                        {
                            prevMoveTo.ClosePoint = previous;
                        }
                    }
                }
                else if (point is MoveToPoint)
                {
                    prevMoveTo = point as MoveToPoint;
                }

                // Next one:
                point = point.Next;
            }

            // Recalc:
            RecalculateBounds();
        }