Initial commit

This commit is contained in:
AbstractConcept 2022-09-13 00:36:34 -05:00
commit 3c7cc0c973
8391 changed files with 704313 additions and 0 deletions

View file

@ -0,0 +1,19 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor.U2D.Path
{
public enum ShapeType
{
Polygon,
Spline
}
public interface IShape
{
ShapeType type { get; }
bool isOpenEnded { get; }
ControlPoint[] ToControlPoints();
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5a73e62a38f3eed47b8b72483a21b750
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,35 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor.U2D.Path
{
public struct Polygon : IShape
{
public bool isOpenEnded;
public Vector3[] points;
ShapeType IShape.type => ShapeType.Polygon;
bool IShape.isOpenEnded => isOpenEnded;
ControlPoint[] IShape.ToControlPoints()
{
if (points == null)
throw new NullReferenceException("Points array is null");
var controlPoints = new List<ControlPoint>();
foreach (var point in points)
{
controlPoints.Add(new ControlPoint() { position = point });
}
return controlPoints.ToArray();
}
public static Polygon empty = new Polygon() { isOpenEnded = true, points = new Vector3[0] };
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ab23b6f3169984a4c87cbc3f7fe44ca6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,102 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor.U2D.Path
{
public static class ShapeExtensions
{
public static Polygon ToPolygon(this Vector3[] points, bool isOpenEnded)
{
return new Polygon()
{
isOpenEnded = isOpenEnded,
points = points
};
}
public static Spline ToSpline(this Vector3[] points, bool isOpenEnded)
{
if (!points.IsSpline(isOpenEnded) && points.IsSpline(!isOpenEnded))
{
var pointList = new List<Vector3>(points);
if (isOpenEnded)
{
while (pointList.Count % 3 != 1)
pointList.RemoveAt(pointList.Count-1);
points = pointList.ToArray();
}
else
{
var last = pointList[pointList.Count-1];
var first = pointList[0];
var v = first - last;
pointList.Add(last + v.normalized * (v.magnitude / 3f));
pointList.Add(first - v.normalized * (v.magnitude / 3f));
points = pointList.ToArray();
}
}
if (!points.IsSpline(isOpenEnded))
throw new Exception("The provided control point array can't conform a Spline.");
return new Spline()
{
isOpenEnded = isOpenEnded,
points = points
};
}
public static bool IsSpline(this Vector3[] points, bool isOpenEnded)
{
if (points.Length < 4)
return false;
if (isOpenEnded && points.Length % 3 != 1)
return false;
if (!isOpenEnded && points.Length % 3 != 0)
return false;
return true;
}
public static Spline ToSpline(this Polygon polygon)
{
var newPointCount = polygon.points.Length * 3;
if (polygon.isOpenEnded)
newPointCount = (polygon.points.Length - 1) * 3 + 1;
var newPoints = new Vector3[newPointCount];
var controlPoints = polygon.points;
var pointCount = controlPoints.Length;
for (var i = 0; i < pointCount; ++i)
{
var nextIndex = (i + 1) % pointCount;
var point = controlPoints[i];
var v = controlPoints[nextIndex] - point;
newPoints[i * 3] = point;
if (i * 3 + 2 < newPointCount)
{
newPoints[i * 3 + 1] = point + v / 3f;
newPoints[i * 3 + 2] = point + v * 2f / 3f;
}
}
return new Spline()
{
isOpenEnded = polygon.isOpenEnded,
points = newPoints
};
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3a27db178f5cab64491b34ed346797d8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,102 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor.U2D.Path
{
public struct Spline : IShape
{
public bool isOpenEnded;
public Vector3[] points;
ShapeType IShape.type => ShapeType.Spline;
bool IShape.isOpenEnded => isOpenEnded;
ControlPoint[] IShape.ToControlPoints()
{
if (points == null)
throw new NullReferenceException("Points array is null");
if (!points.IsSpline(isOpenEnded))
throw new Exception("The provided control point array can't conform a Spline.");
var controlPoints = new List<ControlPoint>();
var leftTangent = Vector3.zero;
var rightTangent = Vector3.zero;
var pointCount = points.Length;
for (var i = 0; i < pointCount; i += 3)
{
if (i == 0)
{
if (isOpenEnded)
leftTangent = points[0];
else
leftTangent = points[EditablePathUtility.Mod(-1, pointCount)];
}
if (i == pointCount - 1 && isOpenEnded)
rightTangent = points[i];
else
rightTangent = points[i+1];
controlPoints.Add(
new ControlPoint()
{
position = points[i],
leftTangent = leftTangent,
rightTangent = rightTangent,
tangentMode = TangentMode.Broken
});
if (i == pointCount - 1 && isOpenEnded)
leftTangent = Vector3.zero;
else
leftTangent = points[i+2];
}
pointCount = controlPoints.Count;
for (var i = 0; i < pointCount; ++i)
{
var prevIndex = EditablePathUtility.Mod(i-1, pointCount);
var nextIndex = EditablePathUtility.Mod(i+1, pointCount);
var controlPoint = controlPoints[i];
var prevControlPoint = controlPoints[prevIndex];
var nextControlPoint = controlPoints[nextIndex];
var liniarLeftPosition = (prevControlPoint.position - controlPoint.position) / 3f;
var isLeftTangentLinear = (controlPoint.localLeftTangent - liniarLeftPosition).sqrMagnitude < 0.001f;
if (isLeftTangentLinear)
controlPoint.localLeftTangent = Vector3.zero;
var liniarRightPosition = (nextControlPoint.position - controlPoint.position) / 3f;
var isRightTangentLinear = (controlPoint.localRightTangent - liniarRightPosition).sqrMagnitude < 0.001f;
if (isRightTangentLinear)
controlPoint.localRightTangent = Vector3.zero;
var tangentDotProduct = Vector3.Dot(controlPoint.localLeftTangent.normalized, controlPoint.localRightTangent.normalized);
var isContinous = tangentDotProduct < 0f && (tangentDotProduct + 1) * (tangentDotProduct + 1) < 0.001f;
if (isLeftTangentLinear && isRightTangentLinear)
controlPoint.tangentMode = TangentMode.Linear;
else if (isLeftTangentLinear || isRightTangentLinear)
controlPoint.tangentMode = TangentMode.Broken;
else if (isContinous)
controlPoint.tangentMode = TangentMode.Continuous;
controlPoints[i] = controlPoint;
}
return controlPoints.ToArray();
}
public static Spline empty = new Spline() { isOpenEnded = true, points = new Vector3[0] };
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 03c61de02af9d914c9cc9dd9f1174223
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: