Initial Commit
This commit is contained in:
commit
ee5c2f922d
2255 changed files with 547750 additions and 0 deletions
10
Assets/Scripts/UI/Tilemap/Brushes/Line Brush/Scripts.meta
Normal file
10
Assets/Scripts/UI/Tilemap/Brushes/Line Brush/Scripts.meta
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6a7de8b7c9f16a54abb1f4e4b4dda454
|
||||
folderAsset: yes
|
||||
timeCreated: 1499149780
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a4ce1d57936070949bdd366b4d13335f
|
||||
folderAsset: yes
|
||||
timeCreated: 1499149785
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,209 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Tilemaps;
|
||||
using System.Linq;
|
||||
|
||||
namespace UnityEditor
|
||||
{
|
||||
[CustomGridBrush(true, false, false, "Line Brush")]
|
||||
public class LineBrush : UnityEditor.Tilemaps.GridBrush
|
||||
{
|
||||
public bool lineStartActive = false;
|
||||
public bool fillGaps = false;
|
||||
public Vector3Int lineStart = Vector3Int.zero;
|
||||
|
||||
public override void Paint(GridLayout grid, GameObject brushTarget, Vector3Int position)
|
||||
{
|
||||
if (lineStartActive)
|
||||
{
|
||||
Vector2Int startPos = new Vector2Int(lineStart.x, lineStart.y);
|
||||
Vector2Int endPos = new Vector2Int(position.x, position.y);
|
||||
if (startPos == endPos)
|
||||
base.Paint(grid, brushTarget, position);
|
||||
else
|
||||
{
|
||||
foreach (var point in GetPointsOnLine(startPos, endPos, fillGaps))
|
||||
{
|
||||
Vector3Int paintPos = new Vector3Int(point.x, point.y, position.z);
|
||||
base.Paint(grid, brushTarget, paintPos);
|
||||
}
|
||||
}
|
||||
lineStartActive = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
lineStart = position;
|
||||
lineStartActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
[MenuItem("Assets/Create/Line Brush")]
|
||||
public static void CreateBrush()
|
||||
{
|
||||
string path = EditorUtility.SaveFilePanelInProject("Save Line Brush", "New Line Brush", "asset", "Save Line Brush", "Assets");
|
||||
|
||||
if (path == "")
|
||||
return;
|
||||
|
||||
AssetDatabase.CreateAsset(ScriptableObject.CreateInstance<LineBrush>(), path);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Added option to fill gaps for continuous lines.
|
||||
/// </summary>
|
||||
public static IEnumerable<Vector2Int> GetPointsOnLine(Vector2Int startPos, Vector2Int endPos, bool fillGaps)
|
||||
{
|
||||
var points = GetPointsOnLine(startPos, endPos);
|
||||
if (fillGaps)
|
||||
{
|
||||
var rise = endPos.y - startPos.y;
|
||||
var run = endPos.x - startPos.x;
|
||||
|
||||
if (rise != 0 || run != 0)
|
||||
{
|
||||
var extraStart = startPos;
|
||||
var extraEnd = endPos;
|
||||
|
||||
|
||||
if (Mathf.Abs(rise) >= Mathf.Abs(run))
|
||||
{
|
||||
// up
|
||||
if (rise > 0)
|
||||
{
|
||||
extraStart.y += 1;
|
||||
extraEnd.y += 1;
|
||||
}
|
||||
// down
|
||||
else // rise < 0
|
||||
{
|
||||
|
||||
extraStart.y -= 1;
|
||||
extraEnd.y -= 1;
|
||||
}
|
||||
}
|
||||
else // Mathf.Abs(rise) < Mathf.Abs(run)
|
||||
{
|
||||
|
||||
// right
|
||||
if (run > 0)
|
||||
{
|
||||
extraStart.x += 1;
|
||||
extraEnd.x += 1;
|
||||
}
|
||||
// left
|
||||
else // run < 0
|
||||
{
|
||||
extraStart.x -= 1;
|
||||
extraEnd.x -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
var extraPoints = GetPointsOnLine(extraStart, extraEnd);
|
||||
extraPoints = extraPoints.Except(new[] { extraEnd });
|
||||
points = points.Union(extraPoints);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return points;
|
||||
}
|
||||
|
||||
// http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html
|
||||
public static IEnumerable<Vector2Int> GetPointsOnLine(Vector2Int p1, Vector2Int p2)
|
||||
{
|
||||
int x0 = p1.x;
|
||||
int y0 = p1.y;
|
||||
int x1 = p2.x;
|
||||
int y1 = p2.y;
|
||||
|
||||
bool steep = Math.Abs(y1 - y0) > Math.Abs(x1 - x0);
|
||||
if (steep)
|
||||
{
|
||||
int t;
|
||||
t = x0; // swap x0 and y0
|
||||
x0 = y0;
|
||||
y0 = t;
|
||||
t = x1; // swap x1 and y1
|
||||
x1 = y1;
|
||||
y1 = t;
|
||||
}
|
||||
if (x0 > x1)
|
||||
{
|
||||
int t;
|
||||
t = x0; // swap x0 and x1
|
||||
x0 = x1;
|
||||
x1 = t;
|
||||
t = y0; // swap y0 and y1
|
||||
y0 = y1;
|
||||
y1 = t;
|
||||
}
|
||||
int dx = x1 - x0;
|
||||
int dy = Math.Abs(y1 - y0);
|
||||
int error = dx / 2;
|
||||
int ystep = (y0 < y1) ? 1 : -1;
|
||||
int y = y0;
|
||||
for (int x = x0; x <= x1; x++)
|
||||
{
|
||||
yield return new Vector2Int((steep ? y : x), (steep ? x : y));
|
||||
error = error - dy;
|
||||
if (error < 0)
|
||||
{
|
||||
y += ystep;
|
||||
error += dx;
|
||||
}
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(LineBrush))]
|
||||
public class LineBrushEditor : UnityEditor.Tilemaps.GridBrushEditor
|
||||
{
|
||||
private LineBrush lineBrush { get { return target as LineBrush; } }
|
||||
|
||||
public override void OnPaintSceneGUI(GridLayout grid, GameObject brushTarget, BoundsInt position, GridBrushBase.Tool tool, bool executing)
|
||||
{
|
||||
base.OnPaintSceneGUI(grid, brushTarget, position, tool, executing);
|
||||
if (lineBrush.lineStartActive)
|
||||
{
|
||||
Tilemap tilemap = brushTarget.GetComponent<Tilemap>();
|
||||
if (tilemap != null)
|
||||
tilemap.ClearAllEditorPreviewTiles();
|
||||
|
||||
// Draw preview tiles for tilemap
|
||||
Vector2Int startPos = new Vector2Int(lineBrush.lineStart.x, lineBrush.lineStart.y);
|
||||
Vector2Int endPos = new Vector2Int(position.x, position.y);
|
||||
if (startPos == endPos)
|
||||
PaintPreview(grid, brushTarget, position.min);
|
||||
else
|
||||
{
|
||||
foreach (var point in LineBrush.GetPointsOnLine(startPos, endPos, lineBrush.fillGaps))
|
||||
{
|
||||
Vector3Int paintPos = new Vector3Int(point.x, point.y, position.z);
|
||||
PaintPreview(grid, brushTarget, paintPos);
|
||||
}
|
||||
}
|
||||
|
||||
if (Event.current.type == EventType.Repaint)
|
||||
{
|
||||
var min = lineBrush.lineStart;
|
||||
var max = lineBrush.lineStart + position.size;
|
||||
|
||||
// Draws a box on the picked starting position
|
||||
GL.PushMatrix();
|
||||
GL.MultMatrix(GUI.matrix);
|
||||
GL.Begin(GL.LINES);
|
||||
Handles.color = Color.blue;
|
||||
Handles.DrawLine(new Vector3(min.x, min.y, min.z), new Vector3(max.x, min.y, min.z));
|
||||
Handles.DrawLine(new Vector3(max.x, min.y, min.z), new Vector3(max.x, max.y, min.z));
|
||||
Handles.DrawLine(new Vector3(max.x, max.y, min.z), new Vector3(min.x, max.y, min.z));
|
||||
Handles.DrawLine(new Vector3(min.x, max.y, min.z), new Vector3(min.x, min.y, min.z));
|
||||
GL.End();
|
||||
GL.PopMatrix();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6210598a979f8724a8dac4531c428889
|
||||
timeCreated: 1499149789
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Loading…
Add table
Add a link
Reference in a new issue