protected override void UpdateRenderPoints() { // TODO // Dirty system ComputeLayout(); RenderPoints.Clear(); m_LineSegmentIndex.Clear(); Vector2 p0 = parent.ChangeCoordinatesTo(this, from); Vector2 p3 = parent.ChangeCoordinatesTo(this, to); for (var index = 0; index < m_BezierSegments.Count; index++) { var bezierSegment = m_BezierSegments[index]; m_LineSegmentIndex.Add(RenderPoints.Count); Vector2 p1 = parent.ChangeCoordinatesTo(this, bezierSegment.m_P1); Vector2 p2 = parent.ChangeCoordinatesTo(this, bezierSegment.m_P2); p3 = parent.ChangeCoordinatesTo(this, bezierSegment.m_P3); int deepness = 0; GenerateRenderPoints(p0, p1, p2, p3, deepness); p0 = p3; } RenderPoints.Add(p3); m_LineSegmentIndex.Add(RenderPoints.Count); }
void GenerateRenderPoints(Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3, int deepness) { if (StraightEnough(p0, p1, p2, p3) || deepness > 6) { RenderPoints.Add(p0); return; } // DeCasteljau algorithm. var midpoint = (p1 + p2) * 0.5f; var left1 = (p0 + p1) * 0.5f; var right2 = (p2 + p3) * 0.5f; var left2 = (left1 + midpoint) * 0.5f; var right1 = (right2 + midpoint) * 0.5f; var split = (left2 + right1) * 0.5f; GenerateRenderPoints(p0, left1, left2, split, deepness + 1); GenerateRenderPoints(split, right1, right2, p3, deepness + 1); }