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; } }
/// <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(); }