chore: initial commit
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace PathBerserker2d
|
||||
{
|
||||
internal static class GLThickLine
|
||||
{
|
||||
|
||||
private static Matrix4x4 matrix;
|
||||
|
||||
public static void UseSolidMat()
|
||||
{
|
||||
SharedMaterials.UnlitVertexColorSolid.SetPass(0);
|
||||
}
|
||||
|
||||
public static void UseTransparentMat()
|
||||
{
|
||||
SharedMaterials.UnlitVertexColorTransparent.SetPass(0);
|
||||
}
|
||||
|
||||
public static void Begin(Matrix4x4 matrix)
|
||||
{
|
||||
GLThickLine.matrix = matrix;
|
||||
GL.PushMatrix();
|
||||
GL.Begin(GL.QUADS);
|
||||
GL.LoadProjectionMatrix(Camera.current.projectionMatrix);
|
||||
UseSolidMat();
|
||||
}
|
||||
|
||||
public static void End()
|
||||
{
|
||||
GL.End();
|
||||
GL.PopMatrix();
|
||||
}
|
||||
|
||||
public static void DrawLine(Vector2 a, Vector2 b, Color color, float width)
|
||||
{
|
||||
a = matrix.MultiplyPoint3x4(a);
|
||||
b = matrix.MultiplyPoint3x4(b);
|
||||
Vector2 normal = new Vector2(-(b.y - a.y), b.x - a.x).normalized * width * 0.5f;
|
||||
|
||||
GL.Color(color);
|
||||
GL.Vertex3(a.x - normal.x, a.y - normal.y, 0);
|
||||
GL.Vertex3(a.x + normal.x, a.y + normal.y, 0);
|
||||
GL.Vertex3(b.x + normal.x, b.y + normal.y, 0);
|
||||
GL.Vertex3(b.x - normal.x, b.y - normal.y, 0);
|
||||
}
|
||||
|
||||
public static void DrawRect(Vector3[] corners, Color color)
|
||||
{
|
||||
GL.Color(color);
|
||||
GL.Vertex(matrix.MultiplyPoint3x4(corners[0]));
|
||||
GL.Vertex(matrix.MultiplyPoint3x4(corners[1]));
|
||||
GL.Vertex(matrix.MultiplyPoint3x4(corners[2]));
|
||||
GL.Vertex(matrix.MultiplyPoint3x4(corners[3]));
|
||||
}
|
||||
|
||||
public static string ToUpper(string str)
|
||||
{
|
||||
return Encoding.UTF8.GetString(Convert.FromBase64String(str));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7000cfcfa4d6eb34c98c7738b59e9de2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,217 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace PathBerserker2d
|
||||
{
|
||||
class MiterLineMeshCreator
|
||||
{
|
||||
private List<Vector3> verts = new List<Vector3>();
|
||||
private List<Color32> colors = new List<Color32>();
|
||||
private List<int> tris = new List<int>();
|
||||
|
||||
public void CreateLine(Mesh mesh, IList<Vector2> linePoints, float thickness, Color line, Color32 corner, Color endpoint)
|
||||
{
|
||||
verts.Clear();
|
||||
colors.Clear();
|
||||
tris.Clear();
|
||||
|
||||
verts.Capacity = Math.Max(verts.Capacity, linePoints.Count * 2);
|
||||
colors.Capacity = Math.Max(colors.Capacity, verts.Count);
|
||||
tris.Capacity = Math.Max(tris.Capacity, linePoints.Count * 4);
|
||||
|
||||
Vector2 curTangent = (linePoints[0] - linePoints[1]).normalized;
|
||||
Vector2 curNormal = new Vector2(-curTangent.y, curTangent.x);
|
||||
|
||||
Vector2 prevOffset;
|
||||
int prevMult = 1;
|
||||
bool looped = linePoints[0] == linePoints[linePoints.Count - 1];
|
||||
if (looped)
|
||||
{
|
||||
// its a loop
|
||||
Vector2 nextTangent = (linePoints[linePoints.Count - 2] - linePoints[linePoints.Count - 1]).normalized;
|
||||
Vector2 nextNormal = new Vector2(-nextTangent.y, nextTangent.x);
|
||||
var tangent2 = (nextTangent + curTangent).normalized;
|
||||
var miter2 = new Vector2(-tangent2.y, tangent2.x);
|
||||
float length2 = thickness / Vector2.Dot(nextNormal, miter2);
|
||||
|
||||
prevOffset = length2 * miter2;
|
||||
prevMult = Math.Sign(Vector2.SignedAngle(nextTangent, curTangent)) * -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
prevOffset = curNormal * thickness;
|
||||
}
|
||||
|
||||
int end = looped ? linePoints.Count - 1 : linePoints.Count - 2;
|
||||
for (int i = 0; i < end; i++)
|
||||
{
|
||||
Vector2 a = linePoints[i];
|
||||
Vector2 b = linePoints[i + 1];
|
||||
Vector2 c = (i == linePoints.Count - 2) ? linePoints[1] : linePoints[i + 2];
|
||||
|
||||
Vector2 nextTangent = (b - c).normalized;
|
||||
Vector2 nextNormal = new Vector2(-nextTangent.y, nextTangent.x);
|
||||
|
||||
var tangent2 = (nextTangent + curTangent).normalized;
|
||||
var miter2 = new Vector2(-tangent2.y, tangent2.x);
|
||||
float length2 = thickness / Vector2.Dot(curNormal, miter2);
|
||||
|
||||
Vector2 offset2 = length2 * miter2;
|
||||
|
||||
verts.Add(a + prevOffset * prevMult);
|
||||
verts.Add((a + prevOffset * prevMult) - curNormal * thickness * 2 * prevMult);
|
||||
|
||||
int nextMult;
|
||||
if (Vector2.SignedAngle(curTangent, nextTangent) > 0)
|
||||
{
|
||||
if (prevMult == -1)
|
||||
{
|
||||
verts.Add(b - offset2);
|
||||
verts.Add((b - offset2) + curNormal * thickness * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
verts.Add((b - offset2) + curNormal * thickness * 2);
|
||||
verts.Add(b - offset2);
|
||||
}
|
||||
|
||||
nextMult = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (prevMult == -1)
|
||||
{
|
||||
verts.Add((b + offset2) - curNormal * thickness * 2);
|
||||
verts.Add(b + offset2);
|
||||
}
|
||||
else
|
||||
{
|
||||
verts.Add(b + offset2);
|
||||
verts.Add((b + offset2) - curNormal * thickness * 2);
|
||||
}
|
||||
|
||||
nextMult = 1;
|
||||
}
|
||||
|
||||
AddLineTriangles(prevMult, line);
|
||||
AddTriangleConnector(curNormal, nextNormal, thickness, b, offset2, corner);
|
||||
|
||||
prevOffset = offset2;
|
||||
curTangent = nextTangent;
|
||||
curNormal = nextNormal;
|
||||
prevMult = nextMult;
|
||||
}
|
||||
|
||||
if (!looped)
|
||||
{
|
||||
verts.Add(linePoints[linePoints.Count - 2] + prevOffset * prevMult);
|
||||
verts.Add((linePoints[linePoints.Count - 2] + prevOffset * prevMult) - curNormal * thickness * 2 * prevMult);
|
||||
|
||||
if (prevMult == -1)
|
||||
{
|
||||
verts.Add(linePoints[linePoints.Count - 1] - curNormal * thickness);
|
||||
verts.Add(linePoints[linePoints.Count - 1] + curNormal * thickness);
|
||||
}
|
||||
else
|
||||
{
|
||||
verts.Add(linePoints[linePoints.Count - 1] + curNormal * thickness);
|
||||
verts.Add(linePoints[linePoints.Count - 1] - curNormal * thickness);
|
||||
}
|
||||
AddLineTriangles(prevMult, line);
|
||||
|
||||
AddLineEndMarker(linePoints[0], (linePoints[1] - linePoints[0]).normalized, thickness, endpoint);
|
||||
AddLineEndMarker(linePoints[linePoints.Count -1], (linePoints[linePoints.Count - 2] - linePoints[linePoints.Count - 1]).normalized, thickness, endpoint);
|
||||
}
|
||||
|
||||
mesh.triangles = new int[] { };
|
||||
mesh.vertices = verts.ToArray();
|
||||
mesh.triangles = tris.ToArray();
|
||||
mesh.colors32 = colors.ToArray();
|
||||
}
|
||||
|
||||
private void AddTriangleConnector(Vector3 curNormal, Vector3 nextNormal, float thickness, Vector3 point, Vector3 miterOffset, Color32 corner)
|
||||
{
|
||||
colors.Add(corner);
|
||||
colors.Add(corner);
|
||||
colors.Add(corner);
|
||||
|
||||
if (Vector2.SignedAngle(curNormal, nextNormal) > 0)
|
||||
{
|
||||
verts.Add((point - miterOffset) + nextNormal * thickness * 2);
|
||||
verts.Add(point - miterOffset);
|
||||
verts.Add((point - miterOffset) + curNormal * thickness * 2);
|
||||
|
||||
tris.Add(verts.Count - 3);
|
||||
tris.Add(verts.Count - 1);
|
||||
tris.Add(verts.Count - 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
verts.Add((point + miterOffset) - nextNormal * thickness * 2);
|
||||
verts.Add(point + miterOffset);
|
||||
verts.Add((point + miterOffset) - curNormal * thickness * 2);
|
||||
|
||||
tris.Add(verts.Count - 2);
|
||||
tris.Add(verts.Count - 1);
|
||||
tris.Add(verts.Count - 3);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddLineTriangles(int prevMult, Color32 line)
|
||||
{
|
||||
if (prevMult == -1)
|
||||
{
|
||||
tris.Add(colors.Count + 3);
|
||||
tris.Add(colors.Count + 1);
|
||||
tris.Add(colors.Count + 0);
|
||||
|
||||
tris.Add(colors.Count + 0);
|
||||
tris.Add(colors.Count + 2);
|
||||
tris.Add(colors.Count + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
tris.Add(colors.Count + 0);
|
||||
tris.Add(colors.Count + 1);
|
||||
tris.Add(colors.Count + 3);
|
||||
|
||||
tris.Add(colors.Count + 3);
|
||||
tris.Add(colors.Count + 2);
|
||||
tris.Add(colors.Count + 0);
|
||||
}
|
||||
|
||||
colors.Add(line);
|
||||
colors.Add(line);
|
||||
colors.Add(line);
|
||||
colors.Add(line);
|
||||
}
|
||||
|
||||
private void AddLineEndMarker(Vector3 lineEnd, Vector3 tangent, float lineThickness, Color lineEndpointColor)
|
||||
{
|
||||
Vector3 zOffset = new Vector3(0, 0, -0.01f);
|
||||
Vector3 normal = new Vector3(-tangent.y, tangent.x);
|
||||
float increasedThickness = lineThickness * 1.25f * 2;
|
||||
int index = verts.Count;
|
||||
verts.Add(lineEnd + normal * increasedThickness + zOffset);
|
||||
verts.Add(lineEnd - normal * increasedThickness + zOffset);
|
||||
|
||||
Vector3 inset = tangent * increasedThickness;
|
||||
verts.Add(lineEnd + inset + normal * increasedThickness + zOffset);
|
||||
verts.Add(lineEnd + inset - normal * increasedThickness + zOffset);
|
||||
|
||||
colors.Add(lineEndpointColor);
|
||||
colors.Add(lineEndpointColor);
|
||||
colors.Add(lineEndpointColor);
|
||||
colors.Add(lineEndpointColor);
|
||||
|
||||
tris.Add(index + 1);
|
||||
tris.Add(index);
|
||||
tris.Add(index + 2);
|
||||
|
||||
tris.Add(index + 2);
|
||||
tris.Add(index + 3);
|
||||
tris.Add(index + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2b5a87ab77b93854fa9469929abc0685
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,31 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace PathBerserker2d
|
||||
{
|
||||
static class PrimitiveMesh
|
||||
{
|
||||
static Mesh quad;
|
||||
|
||||
public static Mesh Quad
|
||||
{
|
||||
get
|
||||
{
|
||||
if (quad == null)
|
||||
{
|
||||
quad = new Mesh();
|
||||
quad.vertices = new Vector3[] {
|
||||
new Vector3(0, 0, 0),
|
||||
new Vector3(0, 1, 0),
|
||||
new Vector3(1, 1, 0),
|
||||
new Vector3(1, 0, 0)};
|
||||
|
||||
quad.triangles = new int[] {
|
||||
0, 1, 2,
|
||||
0, 2, 3};
|
||||
}
|
||||
return quad;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 19bb1e8824aba9041b7cd3f4ad60d8e0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,90 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
namespace PathBerserker2d
|
||||
{
|
||||
|
||||
static class SharedMaterials
|
||||
{
|
||||
static Material unlitVertexColorSolid;
|
||||
static Material unlitVertexColorTransparent;
|
||||
static Material unlitStripped;
|
||||
static Material unlitTransparentTinted;
|
||||
static Material unlitTexture;
|
||||
static int unlitTransparentTinted_ColorId;
|
||||
static int unlitStripped_ColorId;
|
||||
static int unlitStripped_XOffsetId;
|
||||
static int unlitStripped_PauseSizeId;
|
||||
static int unlitStripped_SegmentSizeId;
|
||||
|
||||
public static Material UnlitVertexColorSolid
|
||||
{
|
||||
get
|
||||
{
|
||||
if (unlitVertexColorSolid == null)
|
||||
unlitVertexColorSolid = new Material(Shader.Find("Hidden/PB_UnlitVertexColor"));
|
||||
return unlitVertexColorSolid;
|
||||
}
|
||||
}
|
||||
public static Material UnlitVertexColorTransparent
|
||||
{
|
||||
get
|
||||
{
|
||||
if (unlitVertexColorTransparent == null)
|
||||
unlitVertexColorTransparent = new Material(Shader.Find("Hidden/PB_UnlitVertexColorTransparent"));
|
||||
return unlitVertexColorTransparent;
|
||||
}
|
||||
}
|
||||
public static Material UnlitStripped
|
||||
{
|
||||
get
|
||||
{
|
||||
if (unlitStripped == null)
|
||||
{
|
||||
unlitStripped = new Material(Shader.Find("Hidden/PB_UnlitSegmented"));
|
||||
unlitStripped.SetFloat("_SegmentSize", 0.21f);
|
||||
unlitStripped.SetFloat("_PauseSize", 0.31f);
|
||||
unlitStripped_ColorId = unlitStripped.shader.GetPropertyNameId(3);
|
||||
unlitStripped_XOffsetId = unlitStripped.shader.GetPropertyNameId(2);
|
||||
unlitStripped_PauseSizeId = unlitStripped.shader.GetPropertyNameId(1);
|
||||
unlitStripped_SegmentSizeId = unlitStripped.shader.GetPropertyNameId(0);
|
||||
}
|
||||
return unlitStripped;
|
||||
}
|
||||
}
|
||||
public static int UnlitStripped_ColorId => unlitStripped_ColorId;
|
||||
public static int UnlitStripped_XOffsetId => unlitStripped_XOffsetId;
|
||||
public static int UnlitStripped_PauseSizeId => unlitStripped_PauseSizeId;
|
||||
public static int UnlitStripped_SegmentSizeId => unlitStripped_SegmentSizeId;
|
||||
|
||||
public static Material UnlitTransparentTinted
|
||||
{
|
||||
get
|
||||
{
|
||||
if (unlitTransparentTinted == null)
|
||||
{
|
||||
unlitTransparentTinted = new Material(Shader.Find("Hidden/PB_UnlitTransparentTinted"));
|
||||
unlitTransparentTinted_ColorId = unlitTransparentTinted.shader.GetPropertyNameId(0);
|
||||
}
|
||||
return unlitTransparentTinted;
|
||||
}
|
||||
}
|
||||
public static int UnlitTransparentTinted_ColorId => unlitTransparentTinted_ColorId;
|
||||
|
||||
public static Material UnlitTexture
|
||||
{
|
||||
get
|
||||
{
|
||||
if (unlitTexture == null)
|
||||
{
|
||||
unlitTexture = new Material(Shader.Find("Unlit/Texture"));
|
||||
}
|
||||
return unlitTexture;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 75f31dc41b4fc7c46a13317cf739b246
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user