Пример #1
0
        /// <summary>
        /// Get closet edge and get the point for splitting in "EdgeDivider".
        /// </summary>
        /// <param name="spritePos">sprite position</param>
        /// <param name="without">Edges wll not be used</param>
        /// <returns></returns>
        public EdgeDivider GetClosestEdge(Vector2 spritePos, Edge[] without = null)
        {
            EdgeDivider ed     = new EdgeDivider();
            float       minDis = float.MaxValue;
            List <Edge> wo     = null;

            if (without != null)
            {
                wo = new List <Edge>(without);
            }
            foreach (Edge edge in edges)
            {
                if (without != null && wo.Contains(edge))
                {
                    continue;
                }
                Vector2 v = edge.GetClosest(spritePos);
                float   d = Vector2.Distance(spritePos, v);
                if (d < minDis)
                {
                    minDis      = d;
                    ed.edge     = edge;
                    ed.position = v;
                }
            }
            return(ed);
        }
Пример #2
0
        /// <summary>
        /// Divide the edge.
        /// </summary>
        /// <param name="ed"></param>
        /// <param name="autoOffset"></param>
        /// <returns></returns>
        public SpritePoint DivedeEdge(EdgeDivider ed, bool autoOffset = false)
        {
            SpritePoint newPoint = new SpritePoint(ed.position);
            Edge        e1       = new Edge(ed.edge.point1, newPoint);
            Edge        e2       = new Edge(newPoint, ed.edge.point2);

            AddPoint(newPoint);
            AddEdge(e1);
            AddEdge(e2);
            if (autoOffset)
            {
                float   d1 = Vector2.Distance(ed.edge.point1.spritePosition, ed.position);
                float   d2 = Vector2.Distance(ed.edge.point2.spritePosition, ed.position);
                float   ds = d1 + d2;
                float   w1 = d1 / ds;
                Vector2 np = Vector2.Lerp(ed.edge.point1.spritePosition + ed.edge.point1.offset2d,
                                          ed.edge.point2.spritePosition + ed.edge.point2.offset2d, w1);
                newPoint.offset2d = np - newPoint.spritePosition;
            }
            RemoveEdge(ed.edge);
            return(newPoint);
        }
Пример #3
0
 /// <summary>
 /// Get closet edge and get the point for splitting in "EdgeDivider".
 /// </summary>
 /// <param name="spritePos">sprite position</param>
 /// <param name="without">Edges wll not be used</param>
 /// <returns></returns>
 public EdgeDivider GetClosestEdge(Vector2 spritePos, Edge[] without = null)
 {
     EdgeDivider ed = new EdgeDivider();
     float minDis = float.MaxValue;
     List<Edge> wo = null;
     if (without != null)
     {
         wo = new List<Edge>(without);
     }
     foreach (Edge edge in edges)
     {
         if (without != null && wo.Contains(edge))
         {
             continue;
         }
         Vector2 v = edge.GetClosest(spritePos);
         float d = Vector2.Distance(spritePos, v);
         if (d < minDis)
         {
             minDis = d;
             ed.edge = edge;
             ed.position = v;
         }
     }
     return ed;
 }
Пример #4
0
 /// <summary>
 /// Divide the edge.
 /// </summary>
 /// <param name="ed"></param>
 /// <param name="autoOffset"></param>
 /// <returns></returns>
 public SpritePoint DivedeEdge(EdgeDivider ed, bool autoOffset = false)
 {
     SpritePoint newPoint = new SpritePoint(ed.position);
     Edge e1 = new Edge(ed.edge.point1, newPoint);
     Edge e2 = new Edge(newPoint, ed.edge.point2);
     AddPoint(newPoint);
     AddEdge(e1);
     AddEdge(e2);
     if (autoOffset)
     {
         float d1 = Vector2.Distance(ed.edge.point1.spritePosition, ed.position);
         float d2 = Vector2.Distance(ed.edge.point2.spritePosition, ed.position);
         float ds = d1 + d2;
         float w1 = d1 / ds;
         Vector2 np = Vector2.Lerp(ed.edge.point1.spritePosition + ed.edge.point1.offset2d,
             ed.edge.point2.spritePosition + ed.edge.point2.offset2d, w1);
         newPoint.offset2d = np - newPoint.spritePosition;
     }
     RemoveEdge(ed.edge);
     return newPoint;
 }
Пример #5
0
        void pointTool()
        {
            latestPoint = null;
            if (dragPoint != null)
            {
                dragPoint.spritePosition = getLocalPos(Event.current.mousePosition + deltaDrag);
                drawDragPoint(dragPoint);
                Repaint();
                if (Event.current.rawType == EventType.MouseUp)
                {
                    closestPoint   = dragPoint;
                    dragPoint      = null;
                    clossesDiveder = null;
                    Repaint();
                }
                if (Event.current.type == EventType.MouseDrag)
                {
                    updateSpriteDeformer();
                }
                return;
            }
            if (Event.current.type == EventType.MouseMove)
            {
                float minDis = snapDistance;
                closestPoint = null;
                foreach (SpritePoint p in spriteDeformer.points)
                {
                    float cm = Vector2.Distance(getImagePos(p.spritePosition), Event.current.mousePosition);
                    if (cm < minDis)
                    {
                        minDis       = cm;
                        closestPoint = p;
                    }
                }
                clossesDiveder = null;
                if (closestPoint == null)
                {
                    Vector2     mPos = getLocalPos(mousePosInImage);
                    EdgeDivider ed   = spriteDeformer.GetClosestEdge(mPos);

                    if (Vector2.Distance(getImagePos(ed.position), mousePosInImage) < snapDistance)
                    {
                        clossesDiveder = ed;
                    }
                }
                Repaint();
            }
            if (clossesDiveder != null)
            {
                drawNewPoint(clossesDiveder.position);
            }
            if (closestPoint != null)
            {
                drawClosestPoint(closestPoint);
            }
            if (closestPoint == null && clossesDiveder == null)
            {
                drawNewPoint(getLocalPos(Event.current.mousePosition));
            }

            if (Event.current.type == EventType.MouseDown)
            {
                if (closestPoint != null)
                {
                    dragPoint = closestPoint;
                    deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition;
                }
                else
                {
                    if (clossesDiveder == null)
                    {
                        dragPoint = new SpritePoint(getLocalPos(Event.current.mousePosition));
                        deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition;
                        spriteDeformer.AddPoint(dragPoint, true);
                        updateSpriteDeformer();
                    }
                    else
                    {
                        dragPoint    = spriteDeformer.DivedeEdge(clossesDiveder, true);
                        closestPoint = dragPoint;
                        deltaDrag    = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition;
                        updateSpriteDeformer();
                    }
                }
            }
        }
Пример #6
0
        void deleteTool()
        {
            if (Event.current.type == EventType.MouseMove)
            {
                float minDis = snapDistance;
                closestPoint = null;
                foreach (SpritePoint p in spriteDeformer.points)
                {
                    if (p == latestPoint)
                    {
                        continue;
                    }
                    if (spriteDeformer.ContainsEdge(latestPoint, p))
                    {
                        continue;
                    }

                    float cm = Vector2.Distance(getImagePos(p.spritePosition), Event.current.mousePosition);
                    if (cm < minDis)
                    {
                        minDis       = cm;
                        closestPoint = p;
                    }
                }
                Repaint();
            }


            if (closestPoint != null)
            {
                List <Edge> edges = spriteDeformer.GetEdgesWithPoint(closestPoint);
                if (edges.Count == 0)
                {
                    drawDeletePoint(closestPoint);
                    if (Event.current.type == EventType.MouseUp)
                    {
                        spriteDeformer.RemovePoint(closestPoint);
                        updateSpriteDeformer();
                        closestPoint = null;
                        Repaint();
                    }
                }
                if (edges.Count == 2)
                {
                    drawDeletePoint(closestPoint);
                    SpritePoint anetherPoint1 = edges[0].point1 != closestPoint ? edges[0].point1 : edges[0].point2;
                    SpritePoint anetherPoint2 = edges[1].point1 != closestPoint ? edges[1].point1 : edges[1].point2;
                    drawDeleteEdge(edges[0]);
                    drawDeleteEdge(edges[1]);
                    if (!spriteDeformer.ContainsEdge(anetherPoint1, anetherPoint2))
                    {
                        drawNewEdge(anetherPoint1.spritePosition, anetherPoint2.spritePosition);
                    }
                    if (Event.current.type == EventType.MouseUp)
                    {
                        spriteDeformer.RemovePoint(closestPoint);
                        if (!spriteDeformer.ContainsEdge(anetherPoint1, anetherPoint2))
                        {
                            spriteDeformer.AddEdge(new Edge(anetherPoint1, anetherPoint2));
                        }
                        closestPoint = null;
                        Repaint();
                        updateSpriteDeformer();
                        return;
                    }
                }
                if (edges.Count == 1 || edges.Count > 2)
                {
                    foreach (Edge e in edges)
                    {
                        drawDeleteEdge(e);
                        drawDeletePoint(closestPoint);
                    }
                    if (Event.current.type == EventType.MouseUp)
                    {
                        foreach (Edge e in edges)
                        {
                            spriteDeformer.RemoveEdge(e);
                        }
                        spriteDeformer.RemovePoint(closestPoint);
                        updateSpriteDeformer();
                        closestPoint = null;
                        Repaint();
                    }
                }
            }
            if (closestPoint == null)
            {
                EdgeDivider ed = spriteDeformer.GetClosestEdge(getLocalPos(Event.current.mousePosition));

                if (Vector2.Distance(getImagePos(ed.position), Event.current.mousePosition) < snapDistance / 2)
                {
                    drawDeleteEdge(ed.edge);

                    if (Event.current.type == EventType.MouseUp)
                    {
                        spriteDeformer.RemoveEdge(ed.edge);
                        Repaint();
                    }
                }
            }
        }
Пример #7
0
        void pointTool()
        {
            latestPoint = null;
            if (dragPoint != null)
            {
                dragPoint.spritePosition = getLocalPos(Event.current.mousePosition + deltaDrag);
                drawDragPoint(dragPoint);
                Repaint();
                if (Event.current.rawType == EventType.MouseUp)
                {
                    closestPoint = dragPoint;
                    dragPoint = null;
                    clossesDiveder = null;
                    Repaint();
                }
                if (Event.current.type == EventType.MouseDrag)
                    updateSpriteDeformer();
                return;
            }
            if (Event.current.type == EventType.MouseMove)
            {
                float minDis = snapDistance;
                closestPoint = null;
                foreach (SpritePoint p in spriteDeformer.points)
                {
                    float cm = Vector2.Distance(getImagePos(p.spritePosition), Event.current.mousePosition);
                    if (cm < minDis)
                    {
                        minDis = cm;
                        closestPoint = p;
                    }
                }
                clossesDiveder = null;
                if (closestPoint == null)
                {
                    Vector2 mPos = getLocalPos(mousePosInImage);
                    EdgeDivider ed = spriteDeformer.GetClosestEdge(mPos);

                    if (Vector2.Distance(getImagePos(ed.position), mousePosInImage) < snapDistance)
                    {
                        clossesDiveder = ed;
                    }
                }
                Repaint();
            }
            if (clossesDiveder != null)
            {
                drawNewPoint(clossesDiveder.position);
            }
            if (closestPoint != null)
            {
                drawClosestPoint(closestPoint);
            }
            if (closestPoint == null && clossesDiveder == null)
            {
                drawNewPoint(getLocalPos(Event.current.mousePosition));
            }

            if (Event.current.type == EventType.mouseDown)
            {
                if (closestPoint != null)
                {
                    dragPoint = closestPoint;
                    deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition;
                }
                else
                {
                    if (clossesDiveder == null)
                    {
                        dragPoint = new SpritePoint(getLocalPos(Event.current.mousePosition));
                        deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition;
                        spriteDeformer.AddPoint(dragPoint, true);
                        updateSpriteDeformer();
                    }
                    else
                    {
                        dragPoint = spriteDeformer.DivedeEdge(clossesDiveder, true);
                        closestPoint = dragPoint;
                        deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition;
                        updateSpriteDeformer();
                    }
                }
            }

        }