public override void Execute( )
        {
            var pointView  = evt.data as PointView;
            var polyView   = pointView.poly;
            var polyEntity = lookup.libs[polyView];

            int count = polyEntity.Points.Count;

            if (count <= 3)
            {
                return;
            }

            var index     = polyView.points.IndexOf(pointView);
            var preIndex  = (count + index - 1) % count;
            var nextIndex = (index + 1) % count;


            //Calc new curve position
            var point_0 = polyEntity.Points[preIndex];
            var point_1 = polyEntity.Points[index];
            var point_2 = polyEntity.Points[nextIndex];

            var p0 = point_0.position;
            var p1 = point_1.position;
            var p2 = point_2.position;

            var h0 = Bezier.CalcHandler(p0, p1, point_0.curvePosition);
            var h1 = Bezier.CalcHandler(p1, p2, point_1.curvePosition);

            var newCurvePos = (h0 + h1) * 0.5f;

            Vector2 skew = (Vector2)newCurvePos;

            if (CGAlgorithm.Intersect2D_2SkewSegments(p0, h0, p2, h1, ref skew))
            {
                var cIsLeft = Mathf.Sign(CGAlgorithm.IsLeft(p0, p2, p1));
                var sIsLeft = Mathf.Sign(CGAlgorithm.IsLeft(p0, p2, skew));
                if (cIsLeft * sIsLeft > 0)
                {
                    newCurvePos = Bezier.CalcCurve(p0, p2, ( Vector3 )skew);
                }
            }


            var pointEntity = polyEntity.Points[index];
            var lineView    = polyView.lines[index];
            var preLine     = polyView.lines[preIndex];
            var nextPoint   = polyView.points[nextIndex];

            preLine.endPoint      = nextPoint;
            preLine.curvePosition = newCurvePos;// pointEntity.position;
            preLine.OnRender( );

            pointView.OnRecycle( );
            lineView.OnRecycle( );

            polyView.points.Remove(pointView);
            polyView.lines.Remove(lineView);

            //polyEntity.Points [ preIndex ].isCurve = true;
            polyEntity.Points [preIndex].curvePosition = newCurvePos;  // pointEntity.position;

            polyEntity.Points.RemoveAt(index);
        }
Exemplo n.º 2
0
        public override void Execute( )
        {
            var args     = evt.data as InsertAtLineEventArgs;
            var lineView = args.view;
            var pos      = args.pos;

            var polyView = lineView.poly;
            var index    = polyView.lines.IndexOf(lineView);

            int count     = polyView.lines.Count;
            int nextIndex = (index + 1) % count;

            var nextPoint = polyView.points [nextIndex];

            var polyEntity = lookup.libs[polyView];

            #region Calc 1 new end point ans 2 curves point 's position
            var point_0 = polyEntity.Points[index];
            var point_1 = polyEntity.Points[nextIndex];

            var p0 = point_0.position;
            var p1 = point_1.position;
            var c  = point_0.curvePosition;
            var h  = Bezier.CalcHandler(p0, p1, c);

            var factor = Bezier.BinaryFactor(p0, p1, c, pos);

            //var pNew = Bezier.Square(p0, h, p1, factor);

            var h0          = Vector3.Lerp(p0, h, factor);
            var h1          = Vector3.Lerp(h, p1, factor);
            var newPointPos = Vector3.Lerp(h0, h1, factor);
            var c0          = Bezier.CalcCurve(p0, newPointPos, h0);
            var c1          = Bezier.CalcCurve(newPointPos, p1, h1);

            #endregion

            polyEntity.Points [index].curvePosition = c0;
            //polyEntity.Points [ index ].isCurve = true;

            //var pointEntity = new PointEntity(lineView.centerPosition);
            var pointEntity = new PointEntity(newPointPos, c1);

            var newPoint = pointPrefab.Spawn();
            newPoint.transform.parent        = polyView.pointParent;
            newPoint.transform.localPosition = newPointPos;//lineView.centerPosition;

            var newLine = linePrefab.Spawn();
            newLine.transform.parent        = polyView.lineParent;
            newLine.transform.localPosition = Vector3.zero;
            newLine.startPoint    = newPoint;
            newLine.curvePosition = c1;
            newLine.endPoint      = nextPoint;

            lineView.endPoint      = newPoint;
            lineView.curvePosition = c0;

            newLine.OnRender( );
            lineView.OnRender( );

            newPoint.poly = polyView;
            newLine.poly  = polyView;


            if (nextIndex != 0)
            {
                polyView.points.Insert(nextIndex, newPoint);
                polyView.lines.Insert(nextIndex, newLine);
                polyEntity.Points.Insert(nextIndex, pointEntity);
            }
            else
            {
                polyView.points.Add(newPoint);
                polyView.lines.Add(newLine);
                polyEntity.Points.Add(pointEntity);
            }

            //Debug.Log ( "Insert at " + nextIndex );
        }