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