예제 #1
0
    private void    DoPath(Ferr2D_Path path)
    {
        Handles.color = Ferr2D_Visual.PathColor;
        List <Vector2> verts = path.GetVertsRaw();
        Matrix4x4      mat   = path.transform.localToWorldMatrix;

        Handles.matrix = mat;
        for (int i = 0; i < verts.Count - 1; i++)
        {
            Handles.DrawLine(verts[i], verts[i + 1]);
        }
        if (path.closed)
        {
            Handles.DrawLine(verts[0], verts[verts.Count - 1]);
        }
        Handles.matrix = Matrix4x4.identity;
    }
예제 #2
0
    private void DoPath(Ferr2D_Path path)
    {
        Handles.color = Color.white;
        List <Vector2> verts = path.GetVertsRaw();

        for (int i = 0; i < verts.Count - 1; i++)
        {
            Vector3 pos  = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[i].x, verts[i].y, 0), path.transform.localScale);
            Vector3 pos2 = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[i + 1].x, verts[i + 1].y, 0), path.transform.localScale);
            Handles.DrawLine(pos + offset, pos2 + offset);
        }
        if (path.closed)
        {
            Vector3 pos  = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[0].x, verts[0].y, 0), path.transform.localScale);
            Vector3 pos2 = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[verts.Count - 1].x, verts[verts.Count - 1].y, 0), path.transform.localScale);
            Handles.DrawLine(pos + offset, pos2 + offset);
        }
    }
예제 #3
0
    private void    DoPath(Ferr2D_Path path)
    {
        Handles.color = Color.white;
        List <Vector2> verts = path.GetVertsRaw();
        Matrix4x4      mat   = path.transform.localToWorldMatrix;

        for (int i = 0; i < verts.Count - 1; i++)
        {
            Vector3 pos  = mat.MultiplyPoint3x4(verts[i]);
            Vector3 pos2 = mat.MultiplyPoint3x4(verts[i + 1]);
            Handles.DrawLine(pos, pos2);
        }
        if (path.closed)
        {
            Vector3 pos  = mat.MultiplyPoint3x4(verts[0]);
            Vector3 pos2 = mat.MultiplyPoint3x4(verts[verts.Count - 1]);
            Handles.DrawLine(pos, pos2);
        }
    }
예제 #4
0
    private void DoPath(Ferr2D_Path path)
    {
        Handles.color = Color.white;
        Ferr2DT_PathTerrain terrain = path.gameObject.GetComponent <Ferr2DT_PathTerrain>();
        List <Vector2>      verts   = terrain == null?path.GetVertsRaw() : path.GetVerts(terrain.smoothPath, terrain.splitDist, terrain.splitCorners);

        for (int i = 0; i < verts.Count - 1; i++)
        {
            Vector3 pos  = path.transform.position + Vector3.Scale(new Vector3(verts[i].x, verts[i].y, 0), path.transform.localScale);
            Vector3 pos2 = path.transform.position + Vector3.Scale(new Vector3(verts[i + 1].x, verts[i + 1].y, 0), path.transform.localScale);
            Handles.DrawLine(pos + offset, pos2 + offset);
        }
        if (path.closed)
        {
            Vector3 pos  = path.transform.position + Vector3.Scale(new Vector3(verts[0].x, verts[0].y, 0), path.transform.localScale);
            Vector3 pos2 = path.transform.position + Vector3.Scale(new Vector3(verts[verts.Count - 1].x, verts[verts.Count - 1].y, 0), path.transform.localScale);
            Handles.DrawLine(pos + offset, pos2 + offset);
        }
    }
    private List <Vector2> GetSegmentsCombined(float aSplitDist)
    {
        Ferr2D_Path path = Path;
        List <Ferr2DT_TerrainDirection> dirs = new List <Ferr2DT_TerrainDirection>();
        List <Vector2> result = new List <Vector2>();
        List <List <int>               > list = GetSegments(path.GetVertsRaw(), out dirs);

        for (int i = 0; i < list.Count; i++)
        {
            if (smoothPath && list[i].Count > 2)
            {
                result.AddRange(Ferr2D_Path.SmoothSegment(Ferr2D_Path.IndicesToList <Vector2>(path.pathVerts, list[i]), aSplitDist, false));
            }
            else
            {
                result.AddRange(Ferr2D_Path.IndicesToList <Vector2>(path.pathVerts, list[i]));
            }
        }
        return(result);
    }
예제 #6
0
	private void    DoPath               (Ferr2D_Path path)
	{
		Handles.color = Color.white;
		List<Vector2> verts     = path.GetVertsRaw();
        Matrix4x4     mat       = path.transform.localToWorldMatrix;

		for (int i = 0; i < verts.Count - 1; i++)
		{
			Vector3 pos  = mat.MultiplyPoint3x4(verts[i]);
			Vector3 pos2 = mat.MultiplyPoint3x4(verts[i + 1]);
			Handles.DrawLine(pos, pos2);
		}
		if (path.closed)
		{
			Vector3 pos  = mat.MultiplyPoint3x4(verts[0]);
			Vector3 pos2 = mat.MultiplyPoint3x4(verts[verts.Count - 1]);
			Handles.DrawLine(pos, pos2);
		}
	}
예제 #7
0
    private void DoCutOverrideModeHandles(Ferr2D_Path path, Ferr2DT_PathTerrain terrain, Matrix4x4 mat, Transform camTransform)
    {
        List <List <int>               > segments = new List <List <int>               >();
        List <Ferr2DT_TerrainDirection>  dirs     = new List <Ferr2DT_TerrainDirection>();
        List <Vector2> rawVerts = path.GetVertsRaw();

        // cut the terrain into segments, we need segment info to draw these points
        segments = terrain.GetSegments(rawVerts, out dirs);

        for (int s = 0; s < segments.Count; s++)
        {
            List <int>     currSeg   = segments[s];
            List <Vector2> currVerts = Ferr2D_Path.IndicesToList(rawVerts, currSeg);
            List <Ferr2DT_PathTerrain.CutOverrides> overrides = Ferr2D_Path.IndicesToList(terrain.cutOverrides, currSeg);

            // find information about this segment
            Ferr2DT_TerrainDirection   currDir = dirs[s];
            Ferr2DT_SegmentDescription desc    = default(Ferr2DT_SegmentDescription);

            if (currDir != Ferr2DT_TerrainDirection.None)
            {
                desc = terrain.TerrainMaterial.GetDescriptor(currDir);
            }
            else
            {
                desc = terrain.GetDescription(currSeg);
            }

            // if there's no body segment choices, don't bother with the rest of this
            if (desc.body.Length < 2)
            {
                continue;
            }

            Vector2 capLeftSlideDir  = (currVerts[1] - currVerts[0]);
            Vector2 capRightSlideDir = (currVerts[currVerts.Count - 2] - currVerts[currVerts.Count - 1]);
            capLeftSlideDir.Normalize();
            capRightSlideDir.Normalize();
            currVerts[0] -= capLeftSlideDir * desc.capOffset;
            currVerts[currVerts.Count - 1] -= capRightSlideDir * desc.capOffset;

            float distance = Ferr2D_Path.GetSegmentLength(currVerts);

            // how many texture cuts are there on the segment
            float bodyWidth   = desc.body[0].width * (terrain.TerrainMaterial.edgeMaterial.mainTexture.width / terrain.pixelsPerUnit);
            int   textureCuts = Mathf.Max(1, Mathf.FloorToInt(distance / bodyWidth + 0.5f));

            // data is attached to the points still, check if we've switched to a new point
            int activePt       = -1;
            int activeLocalCut = -1;
            for (int c = 0; c < textureCuts; c++)
            {
                float pctGlobal = c / (float)textureCuts;

                int   ptLocal  = 0;
                float pctLocal = 0;
                Ferr2D_Path.PathGlobalPercentToLocal(currVerts, pctGlobal, out ptLocal, out pctLocal, distance, false);

                if (ptLocal != activePt)
                {
                    // if they size down, we need to shorten the data too
                    if (activePt != -1)
                    {
                        CapListSize <int>(ref overrides[activePt].data, activeLocalCut + 3);
                    }
                    activePt       = ptLocal;
                    activeLocalCut = 0;

                    if (overrides[activePt].data == null)
                    {
                        overrides[activePt].data = new List <int>();
                    }
                }

                while (activeLocalCut >= overrides[activePt].data.Count)
                {
                    overrides[activePt].data.Add(0);
                }

                CapFunction cap            = CapDotAuto;
                int         activeOverride = overrides[activePt].data[activeLocalCut];
                if (activeOverride != 0)
                {
                    if (activeOverride == 1)
                    {
                        cap = CapDot1;
                    }
                    else if (activeOverride == 2)
                    {
                        cap = CapDot2;
                    }
                    else if (activeOverride == 3)
                    {
                        cap = CapDot3;
                    }
                    else if (activeOverride == 4)
                    {
                        cap = CapDot4;
                    }
                    else if (activeOverride == 5)
                    {
                        cap = CapDot5;
                    }
                    else if (activeOverride >= 6)
                    {
                        cap = CapDotN;
                    }
                }
                if (Event.current.alt)
                {
                    cap = CapDotReset;
                }

                int   ptShow  = 0;
                float pctShow = 0;
                Ferr2D_Path.PathGlobalPercentToLocal(currVerts, pctGlobal + (1f / textureCuts) * 0.5f, out ptShow, out pctShow, distance, false);

                Vector2 pt  = Ferr2D_Path.LinearGetPt(currVerts, ptShow, pctShow, false);
                Vector3 pos = mat.MultiplyPoint3x4(pt);
                float   sc  = HandleScale(pos) * 0.5f;
                if (Handles.Button(pos, camTransform.rotation, sc, sc, cap))
                {
                    Undo.RecordObject(terrain, "Lock Texture Segment");

                    overrides[activePt].data[activeLocalCut] = Event.current.alt ? 0 : (activeOverride + 1) % (desc.body.Length + 1);
                    EditorUtility.SetDirty(terrain);
                    GUI.changed = true;
                }

                activeLocalCut += 1;
            }
            if (activePt != -1)
            {
                CapListSize <int>(ref overrides[activePt].data, activeLocalCut + 3);
            }
        }
    }
    void OnGUI()
    {
        radius      = EditorGUILayout.FloatField("Radius", radius);
        placeAround = (Transform)EditorGUILayout.ObjectField(placeAround, typeof(Transform), true);

        GUILayout.Label("Parent Transform for Points", EditorStyles.boldLabel);
        EditorGUILayout.BeginHorizontal();
        doTransform = EditorGUILayout.Toggle(doTransform, GUILayout.Width(14f));
        parentItem  = (Transform)EditorGUILayout.ObjectField(parentItem, typeof(Transform), true);
        EditorGUILayout.EndHorizontal();

        GUILayout.Label("EdgeCollider GameObject", EditorStyles.boldLabel);
        EditorGUILayout.BeginHorizontal();
        doEdgeCollider = EditorGUILayout.Toggle(doEdgeCollider, GUILayout.Width(14f));
        edgeCollider   = (EdgeCollider2D)EditorGUILayout.ObjectField(edgeCollider, typeof(EdgeCollider2D), true);
        EditorGUILayout.EndHorizontal();

        GUILayout.Label("Ferr2D terrain points", EditorStyles.boldLabel);
        EditorGUILayout.BeginHorizontal();
        doFerrTerrain = EditorGUILayout.Toggle(doFerrTerrain, GUILayout.Width(14f));
        path          = (Ferr2D_Path)EditorGUILayout.ObjectField(path, typeof(Ferr2D_Path), true);
        EditorGUILayout.EndHorizontal();


        if (GUI.Button(new Rect(3, 170, position.width - 6, 20), "Make a Circle"))
        {
            if (doTransform && parentItem)
            {
                Transform[] transforms = parentItem.GetComponentsInChildren <Transform>();
                Vector2[]   tempPoints = new Vector2[transforms.Length];

                int i = 0;
                foreach (Transform t in transforms)
                {
                    tempPoints[i].x = t.position.x;
                    tempPoints[i].y = t.position.y;

                    i++;
                }

                if (placeAround)
                {
                    PlacePointsInACircle(ref tempPoints, radius, placeAround.position);
                }
                else
                {
                    PlacePointsInACircle(ref tempPoints, radius, Vector2.zero);
                }

                i = 0;
                foreach (Vector2 p in tempPoints)
                {
                    transforms[i].position = new Vector3(p.x, p.y, 0f);
                    i++;
                }
            }
            if (doEdgeCollider && edgeCollider)
            {
                Vector2[] tempPoints = edgeCollider.points;

                if (placeAround)
                {
                    PlacePointsInACircle(ref tempPoints, radius, placeAround.position);
                }
                else
                {
                    PlacePointsInACircle(ref tempPoints, radius, Vector2.zero);
                }

                edgeCollider.points = tempPoints;
            }
            if (doFerrTerrain && path)
            {
                Vector2[] tempPoints = path.GetVertsRaw().ToArray();

                if (placeAround)
                {
                    PlacePointsInACircle(ref tempPoints, radius, placeAround.position, false);
                }
                else
                {
                    PlacePointsInACircle(ref tempPoints, radius, Vector2.zero, false);
                }

                path.pathVerts = new List <Vector2>(tempPoints);

                path.UpdateColliders();
                path.UpdateDependants(true);
            }
        }
    }
예제 #9
0
 private void DoPath(Ferr2D_Path path)
 {
     Handles.color = Color.white;
     List<Vector2> verts = path.GetVertsRaw();
     for (int i = 0; i < verts.Count - 1; i++)
     {
         Vector3 pos  = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[i    ].x, verts[i    ].y, 0), path.transform.localScale);
         Vector3 pos2 = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[i + 1].x, verts[i + 1].y, 0), path.transform.localScale);
         Handles.DrawLine(pos + offset, pos2 + offset);
     }
     if (path.closed)
     {
         Vector3 pos  = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[0              ].x, verts[0              ].y, 0), path.transform.localScale);
         Vector3 pos2 = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[verts.Count - 1].x, verts[verts.Count - 1].y, 0), path.transform.localScale);
         Handles.DrawLine(pos + offset, pos2 + offset);
     }
 }
예제 #10
0
 private void DoPath    (Ferr2D_Path path)
 {
     Handles.color = Color.white;
     Ferr2DT_PathTerrain terrain = path.gameObject.GetComponent<Ferr2DT_PathTerrain>();
     List<Vector2> verts = terrain == null ? path.GetVertsRaw() : path.GetVerts(false, 2, terrain.splitCorners);
     for (int i = 0; i < verts.Count - 1; i++)
     {
         Vector3 pos  = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[i    ].x, verts[i    ].y, 0), path.transform.localScale);
         Vector3 pos2 = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[i + 1].x, verts[i + 1].y, 0), path.transform.localScale);
         Handles.DrawLine(pos + offset, pos2 + offset);
     }
     if (path.closed)
     {
         Vector3 pos  = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[0              ].x, verts[0              ].y, 0), path.transform.localScale);
         Vector3 pos2 = path.transform.position + path.transform.rotation * Vector3.Scale(new Vector3(verts[verts.Count - 1].x, verts[verts.Count - 1].y, 0), path.transform.localScale);
         Handles.DrawLine(pos + offset, pos2 + offset);
     }
 }