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