public PointMover(Transform transform , SpritePoint point)
 {
     this.transform = transform;
     lastPosition = transform.position;
     this.point = point;
     
 }
예제 #2
0
 public override void OnInspectorGUI()
 {
     spriteDeformerAnimation = (SpriteDeformerTargetPoints)target;
     base.InspectorSpriteDeformer();
     base.drawSelectMaterial();
     base.InspectorEditToolBar();
     // List<Point> canSelecteAsAnimate = new List<Point>();
     if (selectedPoints.Count == 1)
     {
         SpritePoint sPoint = selectedPoints[0];
         SpriteDeformerTargetPoints.PointMover targetMover = spriteDeformerAnimation.getAnimationPoint(sPoint);
         Transform targetObject = targetMover != null ? targetMover.transform : null;
         Transform newTarget    = (Transform)EditorGUILayout.ObjectField("Target object: ", targetObject, typeof(Transform), true);
         if (newTarget != targetObject)
         {
             if (targetObject == null)
             {
                 spriteDeformerAnimation.addMoverPoint(sPoint, newTarget);
             }
             if (newTarget == null && targetObject != null)
             {
                 spriteDeformerAnimation.pointMovers.Remove(targetMover);
             }
             if (targetObject != newTarget && targetObject != null)
             {
                 targetMover.transform = newTarget;
             }
             if (newTarget != null)
             {
                 sPoint.offset = spriteDeformer.getOffsetPointPositionByGlobalPosition(sPoint, newTarget.position);
                 upDateMeshDate();
             }
         }
     }
 }
        public override Vector2 getSpritePositionOfSpritePoint(SpritePoint point)
        {
            point.countOfOfsset = countOfShapes + 1;
            Vector2 v2 = point.spritePosition + getPointBlendOffset(point);

            return(v2);
        }
예제 #4
0
        void Update()
        {
            if (spriteDeformer == null)
            {
                return;
            }
            if (Application.isEditor && !Application.isPlaying)
            {
                FillPoints();
            }
            if (points.Count == 0)
            {
                return;
            }
            Vector2 rL = Vector2.zero;

            for (int i = 0; i < points.Count; i++)
            {
                SpritePoint p = points[i];
                rL += spriteDeformer.SpritePositionToLocal(p.spritePosition + p.offset2d);
            }
            rL /= (float)points.Count;
            rL += localOffset;
            Vector3 rG = spriteDeformer.transform.TransformPoint(rL);

            rG.z = transform.position.z;
            transform.position = rG;
        }
예제 #5
0
        /// <summary>
        /// Create new edge and add it to list of edges.
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <returns>Created edge</returns>
        public Edge CreateEdge(SpritePoint p1, SpritePoint p2)
        {
            Edge newEdge = new Edge(p1, p2);

            _edges.Add(newEdge);
            dirty_tris = true;
            return(newEdge);
        }
 public override void doItAfterMovePoints(SpritePoint[] points)
 {
     foreach (var item in spriteDeformerAnimation.pointMovers)
     {
         item.transform.position = spriteDeformer.SpritePositionToGlobal(item.point.spritePosition + item.point.offset2d);
         Undo.RecordObject(item.transform.gameObject, "Move points");
         EditorUtility.SetDirty(item.transform);
     }
     base.doItAfterMovePoints(points);
 }
        public override void RemovePoint(SpritePoint p)
        {
            PointMover pm = getAnimationPoint(p);

            if (pm != null)
            {
                pointMovers.Remove(pm);
            }
            base.RemovePoint(p);
        }
 public PointMover getAnimationPoint(SpritePoint p)
 {
     foreach (var mp in pointMovers)
     {
         if (mp.point == p)
         {
             return(mp);
         }
     }
     return(null);
 }
예제 #9
0
 /// <summary>
 /// Is any edge with this points contains.
 /// </summary>
 /// <param name="p1"></param>
 /// <param name="p2"></param>
 /// <returns></returns>
 public bool ContainsEdge(SpritePoint p1, SpritePoint p2)
 {
     foreach (Edge e in edges)
     {
         if (e.point1 == p1 && e.point2 == p2 || e.point1 == p2 && e.point2 == p1)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #10
0
 /// <summary>
 ///  Get the edge which have this SpritePoints.
 /// </summary>
 /// <param name="p"></param>
 /// <param name="p2"></param>
 /// <returns></returns>
 public Edge GetEdgeWithTwoPoints(SpritePoint p, SpritePoint p2)
 {
     foreach (Edge e in edges)
     {
         if (e.ContainsPoint(p) && e.ContainsPoint(p2))
         {
             return(e);
         }
     }
     return(null);
 }
예제 #11
0
        protected virtual void generateMeshData(bool new_tringulate, bool new_uv, bool new_points, bool new_color, bool new_normals)
        {
            if (new_points || new_color || new_uv || new_normals)
            {
                if (new_normals)
                {
                    NewArray <Vector3>(ref mesh_normals, _points.Count);
                }
                if (new_color)
                {
                    NewArray <Color>(ref mesh_colors, _points.Count);
                }
                if (new_points)
                {
                    NewArray <Vector3>(ref mesh_vertecs, _points.Count);
                }
                if (new_uv)
                {
                    NewArray <Vector2>(ref mesh_uvs, _points.Count);
                }


                //CHanges the sprites position but that is not matched to the actual point position
                for (int i = 0; i < _points.Count; i++)
                {
                    SpritePoint cp = _points[i];
                    //   Debug.Log(_points.Count + " points Count");
                    //   Debug.Log(_points[i].spritePosition);
                    if (new_points)
                    {
                        Vector3 v3 = SpritePositionToLocal(getSpritePositionOfSpritePoint(cp));
                        v3.z            = cp.offsets[0].z;
                        mesh_vertecs[i] = v3;
                    }
                    if (new_normals)
                    {
                        mesh_normals[i] = Vector3.forward;
                    }
                    if (new_color)
                    {
                        mesh_colors[i] = cp.color;
                    }
                    if (new_uv)
                    {
                        mesh_uvs[i] = Vector2.Scale(spriteUVSize, cp.spritePosition) + spriteUVposition;
                    }
                }
            }
            if (new_tringulate)
            {
                tringulate();
                mesh_triangles = triangulator.intTriangles;
            }
        }
예제 #12
0
        /// <summary>
        /// Remove a point and all edges with this point and set true to dirty_tris, dirty_points, dirty_uv.
        /// </summary>
        /// <param name="p"></param>
        public virtual void RemovePoint(SpritePoint p)
        {
            SetAllDirty();
            List <Edge> delEdges = new List <Edge>();

            delEdges.AddRange(GetEdgesWithPoint(p));
            foreach (Edge e in delEdges)
            {
                RemoveEdge(e);
            }
            _points.Remove(p);
        }
        ///public float[] _blendValues = new float[1];

        public override void AddPoint(SpritePoint point, bool autoOffset = false)
        {
            point.countOfOfsset = countOfShapes;
            int index = 0;
            if (points.Count > 0)
            {
                index = points[0].index;
            }
            point.index = index;
            
            base.AddPoint(point, autoOffset);
        }
예제 #14
0
 void FillPoints()
 {
     points.Clear();
     for (int i = 0; i < spriteDeformer.points.Count; i++)
     {
         SpritePoint sp = spriteDeformer.points[i];
         if (sp.name == pointsName)
         {
             points.Add(sp);
         }
     }
 }
        void setColorKeyStart()
        {
            colorOffset = new ColorOffset[selectedPoints.Count];
            for (int i = 0; i < colorOffset.Length; i++)
            {
                SpritePoint item = selectedPoints[i];
                Color32     c    = item.color;
                if (c.a == 0)
                {
                    c.a += 1;
                    colorOffset[i].a = -1;
                }
                else
                {
                    c.a -= 1;
                    colorOffset[i].a = +1;
                }
                if (c.r == 0)
                {
                    c.r += 1;
                    colorOffset[i].r = -1;
                }
                else
                {
                    c.r -= 1;
                    colorOffset[i].r = +1;
                }

                if (c.g == 0)
                {
                    c.g += 1;
                    colorOffset[i].g = -1;
                }
                else
                {
                    c.g -= 1;
                    colorOffset[i].g = +1;
                }
                if (c.b == 0)
                {
                    c.b += 1;
                    colorOffset[i].b = -1;
                }
                else
                {
                    c.b -= 1;
                    colorOffset[i].b = +1;
                }
                item.color = c;
            }
            doItAfterMovePoints(selectedPoints.ToArray());
        }
        public override void AddPoint(SpritePoint point, bool autoOffset = false)
        {
            point.countOfOfsset = countOfShapes;
            int index = 0;

            if (points.Count > 0)
            {
                index = points[0].index;
            }
            point.index = index;

            base.AddPoint(point, autoOffset);
        }
예제 #17
0
        /// <summary>
        /// Get all edges what have this SpritePoint.
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public List <Edge> GetEdgesWithPoint(SpritePoint p)
        {
            List <Edge> edgesp = new List <Edge>();

            foreach (Edge e in edges)
            {
                if (e.ContainsPoint(p))
                {
                    edgesp.Add(e);
                }
            }
            return(edgesp);
        }
예제 #18
0
 void calculateLocalPositions()
 {
     pointsInPivotLocal = new Vector2[spriteDeformerEditor.selectedPoints.Count];
     for (int i = 0; i < pointsInPivotLocal.Length; i++)
     {
         SpritePoint p  = spriteDeformerEditor.selectedPoints[i];
         Vector2     lp = Vector2.Scale(spriteDeformerEditor.spriteDeformer.SpritePositionToLocal(p.spritePosition + p.offset2d),
                                        spriteDeformerEditor.spriteDeformer.transform.lossyScale) - pivot;
         float   a = Mathf.Repeat(-oriant, Mathf.PI * 2);
         Vector2 newLP;
         newLP.x = Mathf.Cos(a) * lp.x - Mathf.Sin(a) * lp.y;
         newLP.y = Mathf.Sin(a) * lp.x + Mathf.Cos(a) * lp.y;
         pointsInPivotLocal[i] = newLP;
     }
 }
예제 #19
0
        /// <summary>
        /// Add point to topology.
        /// </summary>
        /// <param name="point"></param>
        /// <param name="autoOffset"></param>
        public virtual void AddPoint(SpritePoint point, bool autoOffset = false)
        {
            if (point.id != 0)
            {
                Debug.LogError("SpritePoint is not unique", this);
                return;
            }
            lastID++;
            point.id = lastID;
            _points.Add(point);
            SetAllDirty();
            if (autoOffset)
            {
                SpritePoint[] tr = GetTriangleAroundPoint(point);
                if (tr != null)
                {
                    Vector2 u1 = tr[0].spritePosition; // get the triangle UVs
                    Vector2 u2 = tr[1].spritePosition; // get the triangle UVs
                    Vector2 u3 = tr[2].spritePosition; // get the triangle UVs

                    Vector2 l1 = tr[0].spritePosition + (Vector2)tr[0].offset;
                    Vector2 l2 = tr[1].spritePosition + (Vector2)tr[1].offset;
                    Vector2 l3 = tr[2].spritePosition + (Vector2)tr[2].offset;

                    float a = Medvedya.GeometryMath.Triangle.area(u1, u2, u3); if (a == 0f)
                    {
                        return;
                    }

                    float a1 = Medvedya.GeometryMath.Triangle.area(u2, u3, point.spritePosition) / a; if (a1 < 0)
                    {
                        return;
                    }
                    float a2 = Medvedya.GeometryMath.Triangle.area(u3, u1, point.spritePosition) / a; if (a2 < 0)
                    {
                        return;
                    }
                    float a3 = Medvedya.GeometryMath.Triangle.area(u1, u2, point.spritePosition) / a; if (a3 < 0)
                    {
                        return;
                    }

                    Vector2 pInObj = a1 * l1 + a2 * l2 + a3 * l3;

                    point.offset = pInObj - point.spritePosition;
                }
            }
        }
예제 #20
0
        /// <summary>
        /// Remove all points and edges and create new topology as rectangle.
        /// </summary>
        public void SetRectanglePoints()
        {
            ClearEdges();
            ClearPoints();
            SpritePoint upLeft    = new SpritePoint(0, 1);
            SpritePoint downLeft  = new SpritePoint(0, 0);
            SpritePoint upRight   = new SpritePoint(1, 1);
            SpritePoint downRight = new SpritePoint(1, 0);

            AddPoint(upLeft); AddPoint(downLeft); AddPoint(upRight); AddPoint(downRight);

            AddEdge(new Edge(upLeft, upRight));
            AddEdge(new Edge(upRight, downRight));
            AddEdge(new Edge(downRight, downLeft));
            AddEdge(new Edge(downLeft, upLeft));
        }
        public override void RemovePoint(SpritePoint p)
        {
            
            int index = -1;
            for (int i = 0; i < 256; i++)
			{
			    if(p == animationPoints[i])
                {
                    index = i;
                    break;
                }
			}
            if(index != -1)
            busyPoints[index] = false;
            
            base.RemovePoint(p);
        }
    void Start () {
        mySprite = gameObject.AddComponent<SpriteDeformerStatic>();
        mySprite.sprite = sprite;
        mySprite.referenceMaterial = material;
        mySprite.SetRectanglePoints();

        centerPoint = new SpritePoint(0.5f, 0.5f);
        mySprite.AddPoint(centerPoint);
       
        Bounds b = mySprite.bounds;
        foreach (var item in mySprite.points)
        {
            b.Encapsulate((Vector3)mySprite.SpritePositionToLocal(item.spritePosition));
        }
        mySprite.bounds = b;
        mySprite.UpdateMeshImmediate();
	}
예제 #23
0
        /// <summary>
        /// Generate collider2d
        /// </summary>
        public void GenerateCollider()
        {
            NewArray <Vector2[]>(ref colliderRawPaths, borderPaths.Count);

            polygonCollider.pathCount = borderPaths.Count;
            for (int i = 0; i < borderPaths.Count; i++)
            {
                PolygonBorderPath colliderPath = borderPaths[i];
                NewArray <Vector2>(ref colliderRawPaths[i], colliderPath.points.Length);
                for (int j = 0; j < colliderPath.points.Length; j++)
                {
                    SpritePoint currentPoint = _points[colliderPath.points[j]];
                    colliderRawPaths[i][j] = SpritePositionToLocal(getSpritePositionOfSpritePoint(currentPoint) + currentPoint.colliderOffset);
                }
                polygonCollider.SetPath(i, colliderRawPaths[i]);
            }
        }
예제 #24
0
 void setPointsFromPointsInPivotLocal(Vector2 scale, float angle = 0)
 {
     for (int i = 0; i < pointsInPivotLocal.Length; i++)
     {
         SpritePoint p  = spriteDeformerEditor.selectedPoints[i];
         Vector2     lp = Vector2.Scale(pointsInPivotLocal[i], scale);
         Vector2     newLP;
         newLP.x = Mathf.Cos(oriant + angle) * lp.x - Mathf.Sin(oriant + angle) * lp.y;
         newLP.y = Mathf.Sin(oriant + angle) * lp.x + Mathf.Cos(oriant + angle) * lp.y;
         newLP  += pivot;
         Vector2 newLpLocal = new Vector2(
             newLP.x / spriteDeformerEditor.spriteDeformer.transform.lossyScale.x,
             newLP.y / spriteDeformerEditor.spriteDeformer.transform.lossyScale.y);
         p.offset2d = spriteDeformerEditor.spriteDeformer.LocalPositionToSpritePosition(newLpLocal) - p.spritePosition;
         spriteDeformerEditor.doItAfterMovePoints(spriteDeformerEditor.selectedPoints.ToArray());
     }
 }
예제 #25
0
        public List <SpritePoint> GetСonnectedPoint(SpritePoint point, string pointName = "")
        {
            List <SpritePoint> res = new List <SpritePoint>();
            List <Edge>        es  = GetEdgesWithPoint(point);

            foreach (var item in es)
            {
                if (item.ContainsPoint(point))
                {
                    SpritePoint otherPoint = item.point1 == point ? item.point2 : item.point1;
                    if (pointName == "" || pointName == otherPoint.name)
                    {
                        res.Add(otherPoint);
                    }
                }
            }

            return(res);
        }
예제 #26
0
        public override void RemovePoint(SpritePoint p)
        {
            int index = -1;

            for (int i = 0; i < 256; i++)
            {
                if (p == animationPoints[i])
                {
                    index = i;
                    break;
                }
            }
            if (index != -1)
            {
                busyPoints[index] = false;
            }

            base.RemovePoint(p);
        }
예제 #27
0
 /// <summary>
 /// Get the triangle where the point is, it will work only after triangulation was done.
 /// </summary>
 /// <param name="point"></param>
 /// <returns></returns>
 public SpritePoint[] GetTriangleAroundPoint(SpritePoint point)
 {
     for (int i = 0; i < mesh_triangles.Length; i += 3)
     {
         int tr0 = mesh_triangles[i];
         int tr1 = mesh_triangles[i + 1];
         int tr2 = mesh_triangles[i + 2];
         if (
             Medvedya.GeometryMath.Triangle.isBelongOriantByClock(
                 points[tr0].spritePosition,
                 points[tr1].spritePosition,
                 points[tr2].spritePosition, point.spritePosition)
             )
         {
             return(new SpritePoint[] { points[tr0], points[tr1], points[tr2] });
         }
     }
     return(null);
 }
예제 #28
0
 void createNodes()
 {
     for (int i = 0; i < spriteDeformer.points.Count; i++)
     {
         SpritePoint p       = spriteDeformer.points[i];
         Node        newNode = new Node();
         newNode.point            = p;
         newNode.index            = i;
         newNode.useDeltaPosition = useDeltaPosition;
         nodes.Add(newNode);
     }
     foreach (Edge e in spriteDeformer.edges)
     {
         int ind1 = spriteDeformer.points.IndexOf(e.point1);
         int ind2 = spriteDeformer.points.IndexOf(e.point2);
         nodes[ind1].nodes.Add(nodes[ind2]);
         nodes[ind2].nodes.Add(nodes[ind1]);
         connections.Add(new Connection(nodes[ind1], nodes[ind2]));
     }
 }
예제 #29
0
        private void sceneColor()
        {
            Undo.RecordObjects(new Object[] { spriteDeformer }, "Color");
            HandleUtility.AddDefaultControl(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive));
            if (Tools.current != Tool.View)
            {
                Tools.current = Tool.None;
            }
            SpritePoint clossetPoint = null;
            float       minD         = float.MaxValue;

            foreach (var p in spriteDeformer.points)
            {
                Vector2 ps = HandleUtility.WorldToGUIPoint(spriteDeformer.SpritePositionToGlobal(p.offset2d + p.spritePosition));
                float   d  = Vector2.Distance(Event.current.mousePosition, ps);
                if (d < minD)
                {
                    minD         = d;
                    clossetPoint = p;
                }
            }

            /*if (clossetPoint != null && Event.current.type == EventType.mouseMove)
             * {
             *  Handles.color = colorSets[ColorSet.LINE_TO_PAINT].standart;
             *  Handles.color = Color.black;
             *  Vector3 wPos = spriteDeformer.spritePositionToGlobal(clossetPoint.position + clossetPoint.offset2d);
             *  Handles.SphereCap(10000,wPos ,Quaternion.identity ,HandleUtility.GetHandleSize(wPos)*50f);
             *  HandleUtility.Repaint();
             *
             * } */
            if ((Event.current.type == EventType.MouseDown || Event.current.type == EventType.MouseDrag) && clossetPoint != null && Event.current.button == 0 && !Event.current.alt)
            {
                if (clossetPoint.color != spriteDeformer.editorProps.paintColor)
                {
                    clossetPoint.color = spriteDeformer.editorProps.paintColor;
                    upDateMeshDate();
                    doItAfterMovePoints(new SpritePoint[] { clossetPoint });
                }
            }
        }
예제 #30
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);
        }
예제 #31
0
 public override void AddPoint(SpritePoint point, bool autoOffset = false)
 {
     if (base.points.Count >= 256)
     {
         Debug.Log("You can't have more any than 256 points");
         return;
     }
     base.AddPoint(point, autoOffset);
     for (int i = 0; i < 256; i++)
     {
         if (!busyPoints[i])
         {
             busyPoints[i]      = true;
             animationPoints[i] = point;
             PointInfo pi;
             pi.position = point.spritePosition;
             pi.color    = point.color;
             pi.offset   = point.offset;
             setValueByIndex(i, pi);
             break;
         }
     }
 }
        public Vector2 getPointBlendOffset(SpritePoint point)
        {
            Vector2 newOffsetPos = point.offsets[0];

            for (int j = 0; j < countOfShapes; j++)
            {
                float value = _blendValues[j];
#if UNITY_EDITOR
                if (!Application.isPlaying && editorProps.mainToolBar == MainToolBarInspector.EDIT_VERTICS && points.Count > 0)
                {
                    if (j + 1 == points[0].index)
                    {
                        value = 1;
                    }
                    else
                    {
                        value = 0;
                    }
                }
#endif
                newOffsetPos += Vector2.Lerp(point.offsets[0], point.offsets[j + 1], value) - (Vector2)point.offsets[0];
            }
            return(newOffsetPos);
        }
 public override void AddPoint(SpritePoint point, bool autoOffset = false)
 {
     if (base.points.Count >= 256)
     {
         Debug.Log("You can't have more any than 256 points");
         return;
     }
     base.AddPoint(point, autoOffset);
     for (int i = 0; i < 256; i++)
     {
         if (!busyPoints[i])
         {
             busyPoints[i] = true;
             animationPoints[i] = point;
             PointInfo pi;
             pi.position = point.spritePosition;
             pi.color = point.color;
             pi.offset = point.offset;
             setValueByIndex(i, pi);
             break;
         }
     }
     
 }
 public override Vector2 getSpritePositionOfSpritePoint(SpritePoint point)
 {
     point.countOfOfsset = countOfShapes + 1;
     Vector2 v2 = point.spritePosition + getPointBlendOffset(point); 
     return v2;
 }
 public PointMover getAnimationPoint(SpritePoint p)
 {
     foreach (var mp in pointMovers)
     {
         if (mp.point == p) return mp;
     }
     return null;
 }
예제 #36
0
 /// <summary>
 /// Get all edges what have this SpritePoint.
 /// </summary>
 /// <param name="p"></param>
 /// <returns></returns>
 public List<Edge> GetEdgesWithPoint(SpritePoint p)
 {
     List<Edge> edgesp = new List<Edge>();
     foreach (Edge e in edges)
     {
         if (e.ContainsPoint(p))
         {
             edgesp.Add(e);
         }
     }
     return edgesp;
 }
예제 #37
0
 /// <summary>
 ///  Get the edge which have this SpritePoints.
 /// </summary>
 /// <param name="p"></param>
 /// <param name="p2"></param>
 /// <returns></returns>
 public Edge GetEdgeWithTwoPoints(SpritePoint p, SpritePoint p2)
 {
     foreach (Edge e in edges)
     {
         if (e.ContainsPoint(p) && e.ContainsPoint(p2))
         {
             return e;
         }
     }
     return null;
 }
예제 #38
0
        private Vector2 startSelectedRect;//in gui
        public virtual void doItAfterMovePoints(SpritePoint[] points)
        {

        }
예제 #39
0
        public List<SpritePoint> GetСonnectedPoint(SpritePoint point, string pointName = "")
        {
            List<SpritePoint> res = new List<SpritePoint>();
            List<Edge> es = GetEdgesWithPoint(point);
            foreach (var item in es)
            {
                if (item.ContainsPoint(point))
                {
                    SpritePoint otherPoint = item.point1 == point ? item.point2 : item.point1;
                    if (pointName == "" || pointName == otherPoint.name)
                    {
                        res.Add(otherPoint);
                    }
                }
            }

            return res;
        }
        public Vector2 getPointBlendOffset(SpritePoint point)
        {
            Vector2 newOffsetPos = point.offsets[0];
            for (int j = 0; j < countOfShapes; j++)
            {
                float value = _blendValues[j];
#if UNITY_EDITOR
                if (!Application.isPlaying && editorProps.mainToolBar == MainToolBarInspector.EDIT_VERTICS && points.Count > 0)
                    if (j + 1 == points[0].index)
                        value = 1;
                    else value = 0;
#else
#endif
                newOffsetPos += Vector2.Lerp(point.offsets[0], point.offsets[j + 1], value) - (Vector2)point.offsets[0];
            }
            return newOffsetPos;
        }
예제 #41
0
        /// <summary>
        /// Add point to topology.
        /// </summary>
        /// <param name="point"></param>
        /// <param name="autoOffset"></param>
        public virtual void AddPoint(SpritePoint point, bool autoOffset = false)
        {
            _points.Add(point);
            SetAllDirty();
            if (autoOffset)
            {
                SpritePoint[] tr = GetTriangleAroundPoint(point);
                if (tr != null)
                {
                    Vector2 u1 = tr[0].spritePosition; // get the triangle UVs
                    Vector2 u2 = tr[1].spritePosition; // get the triangle UVs
                    Vector2 u3 = tr[2].spritePosition; // get the triangle UVs

                    Vector2 l1 = tr[0].spritePosition + (Vector2)tr[0].offset;
                    Vector2 l2 = tr[1].spritePosition + (Vector2)tr[1].offset;
                    Vector2 l3 = tr[2].spritePosition + (Vector2)tr[2].offset;

                    float a = Medvedya.GeometryMath.Triangle.area(u1, u2, u3); if (a == 0f) return;

                    float a1 = Medvedya.GeometryMath.Triangle.area(u2, u3, point.spritePosition) / a; if (a1 < 0) return;
                    float a2 = Medvedya.GeometryMath.Triangle.area(u3, u1, point.spritePosition) / a; if (a2 < 0) return;
                    float a3 = Medvedya.GeometryMath.Triangle.area(u1, u2, point.spritePosition) / a; if (a3 < 0) return;

                    Vector2 pInObj = a1 * l1 + a2 * l2 + a3 * l3;

                    point.offset = pInObj - point.spritePosition;
                }
            }
        }
 public PointMover(Transform transform, SpritePoint point)
 {
     this.transform = transform;
     lastPosition   = transform.position;
     this.point     = point;
 }
예제 #43
0
        /// <summary>
        /// Remove all points and edges and create new topology as rectangle.
        /// </summary>
        public void SetRectanglePoints()
        {
            ClearEdges();
            ClearPoints();
            SpritePoint upLeft = new SpritePoint(0, 1);
            SpritePoint downLeft = new SpritePoint(0, 0);
            SpritePoint upRight = new SpritePoint(1, 1);
            SpritePoint downRight = new SpritePoint(1, 0);
            AddPoint(upLeft); AddPoint(downLeft); AddPoint(upRight); AddPoint(downRight);

            AddEdge(new Edge(upLeft, upRight));
            AddEdge(new Edge(upRight, downRight));
            AddEdge(new Edge(downRight, downLeft));
            AddEdge(new Edge(downLeft, upLeft));

        }
예제 #44
0
 void drawDragPoint(SpritePoint p)
 {
     drawDot(p.spritePosition, Color.yellow);
 }
예제 #45
0
 /// <summary>
 /// Remove points and all edges with this points.
 /// </summary>
 /// <param name="points"></param>
 public void RemovePoints(SpritePoint[] points)
 {
     foreach (SpritePoint p in points)
     {
         RemovePoint(p);
     }
 }
예제 #46
0
 public virtual Vector2 getSpritePositionOfSpritePoint(SpritePoint point)
 {
     
     return point.spritePosition + (Vector2)point.offsets[0]; 
 }
예제 #47
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;
 }
예제 #48
0
 /// <summary>
 /// Is any edge with this points contains. 
 /// </summary>
 /// <param name="p1"></param>
 /// <param name="p2"></param>
 /// <returns></returns>
 public bool ContainsEdge(SpritePoint p1, SpritePoint p2)
 {
     foreach (Edge e in edges)
     {
         if (e.point1 == p1 && e.point2 == p2 || e.point1 == p2 && e.point2 == p1) return true;
     }
     return false;
 }
 public override void RemovePoint(SpritePoint p)
 {
     PointMover pm = getAnimationPoint(p);
     if (pm != null)
     {
         pointMovers.Remove(pm);
     }
     base.RemovePoint(p);
 }
        public void addMoverPoint(SpritePoint point, Transform target)
        {
            PointMover newPointMover = new PointMover(target, point);

            pointMovers.Add(newPointMover);
        }
예제 #51
0
 public bool ContainsPoint(SpritePoint p)
 {
     return(p == point1 || p == point2);
 }
예제 #52
0
 public Edge(SpritePoint p1, SpritePoint p2)
 {
     point1 = p1;
     point2 = p2;
 }
 public void addMoverPoint(SpritePoint point , Transform target)
 {
     PointMover newPointMover = new PointMover(target,point);
     pointMovers.Add(newPointMover);
       
 }
예제 #54
0
 public bool ContainsPoint(SpritePoint p)
 {
     return p == point1 || p == point2;
 }
예제 #55
0
 /// <summary>
 /// Create new edge and add it to list of edges.
 /// </summary>
 /// <param name="p1"></param>
 /// <param name="p2"></param>
 /// <returns>Created edge</returns>
 public Edge CreateEdge(SpritePoint p1, SpritePoint p2)
 {
     Edge newEdge = new Edge(p1, p2);
     _edges.Add(newEdge);
     dirty_tris = true;
     return newEdge;
 }
 public override void doItAfterMovePoints(SpritePoint[] points)
 {
     foreach (SpritePoint p in points)
     { 
         List<SpritePoint> lps = new List<SpritePoint>();
         lps.AddRange(spriteDeformerAnimation.animationPoints);
         int index = lps.IndexOf(p);
         SpriteDeformerAnimation.PointInfo pi = new SpriteDeformerAnimation.PointInfo();
         pi.color = p.color;
         pi.position = p.spritePosition;
         pi.offset = p.offset;
         spriteDeformerAnimation.setValueByIndex(index, pi);
     }
     base.doItAfterMovePoints(points);
 }
예제 #57
0
 /// <summary>
 /// Get the triangle where the point is, it will work only after triangulation was done.
 /// </summary>
 /// <param name="point"></param>
 /// <returns></returns>
 public SpritePoint[] GetTriangleAroundPoint(SpritePoint point)
 {
     for (int i = 0; i < mesh_triangles.Length; i += 3)
     {
         int tr0 = mesh_triangles[i];
         int tr1 = mesh_triangles[i + 1];
         int tr2 = mesh_triangles[i + 2];
         if (
              Medvedya.GeometryMath.Triangle.isBelongOriantByClock(
              points[tr0].spritePosition,
              points[tr1].spritePosition,
              points[tr2].spritePosition, point.spritePosition)
              )
         {
             return new SpritePoint[] { points[tr0], points[tr1], points[tr2] };
         }
     }
     return null;
 }
예제 #58
0
 public Vector2 getOffsetPointPositionByGlobalPosition(SpritePoint point, Vector3 globalPosition)
 {
     Vector2 newPointPosition = GlobalPositionToSpritePosition(globalPosition);
     return newPointPosition - point.spritePosition;
 }
예제 #59
0
        /// <summary>
        /// Remove a point and all edges with this point and set true to dirty_tris, dirty_points, dirty_uv.
        /// </summary>
        /// <param name="p"></param>
        public virtual void RemovePoint(SpritePoint p)
        {
            SetAllDirty();
            List<Edge> delEdges = new List<Edge>();
            delEdges.AddRange(GetEdgesWithPoint(p));
            foreach (Edge e in delEdges)
            {
                RemoveEdge(e);
            }
            _points.Remove(p);

        }
예제 #60
0
 void drawPoint(SpritePoint p)
 {
     drawDot(p.spritePosition, Color.green);
 }