Skip to content

Commit

Permalink
Release v2.2.3
Browse files Browse the repository at this point in the history
  • Loading branch information
Wiktor Rott committed Aug 2, 2021
1 parent 6d7bc4a commit dc0fcbe
Show file tree
Hide file tree
Showing 24 changed files with 677 additions and 217 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## v2.2.3 [02.08.2021]
- Adding Jobs system for mesh generation.

## v2.1.3 [26.07.2021]
- Fix for index out of bounds error when creating new bezier spline.
- Getting rid of EditorUtility.SetDirty invokes which will soon become deprecated.
Expand Down
47 changes: 30 additions & 17 deletions Runtime/BezierSpline.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ public class BezierSpline : MonoBehaviour

private readonly List<float> normalsOffsetCopyList = new List<float>();

[SerializeField]
private int curvesCount = 0;

[SerializeField]
private bool isLoop = default;

Expand Down Expand Up @@ -86,7 +89,19 @@ public enum BezierControlPointMode : int
/// <summary>
/// Gets number of curves in the splines.
/// </summary>
public int CurvesCount => Mathf.Max(0, (PointsCount - 1) / 3);
public int CurvesCount
{
get
{
if (curvesCount == 0)
{
curvesCount = Mathf.Max(0, (PointsCount - 1) / 3);
}

return curvesCount;
}
private set => curvesCount = value;
}

/// <summary>
/// Gets number of points in the spline.
Expand Down Expand Up @@ -673,7 +688,7 @@ public void RecalculateNormals()
var targetDistance = GetLinearLength(targetT: currentTargetT, precision: 0.00001f, useWorldScale: false);
normals[0] = normalsPath.Normals[0];
Tangents[0] = normalsPath.Tangents[0];
for (var i = 1; i < normalsPath.Points.Length; i++)
for (var i = 1; i < normalsPath.Points.Count; i++)
{
distance += Vector3.Distance(normalsPath.Points[i - 1], normalsPath.Points[i]);
if (distance >= targetDistance)
Expand All @@ -700,8 +715,8 @@ public void RecalculateNormals()
}
else
{
normals[normals.Count - 1] = normalsPath.Normals[normalsPath.Normals.Length - 1];
Tangents[Tangents.Count - 1] = normalsPath.Tangents[normalsPath.Tangents.Length - 1];
normals[normals.Count - 1] = normalsPath.Normals[normalsPath.Normals.Count - 1];
Tangents[Tangents.Count - 1] = normalsPath.Tangents[normalsPath.Tangents.Count - 1];
}

globalNormalsRotation = globalAngleCopy;
Expand All @@ -721,11 +736,12 @@ public void RecalculateNormals()
/// <param name="useWorldSpace">Transform points from local space to world space.</param>
public void GetEvenlySpacedPoints(float spacing, SplinePath bezierPath, float precision = 0.001f, bool useWorldSpace = true)
{
var scales = new List<Vector3>();
var normals = new List<Vector3>();
var tangents = new List<Vector3>();
var parametersT = new List<float>();
var spacedPoints = new List<Vector3>();
bezierPath.Reset();
var scales = bezierPath.Scales;
var normals = bezierPath.Normals;
var tangents = bezierPath.Tangents;
var parametersT = bezierPath.ParametersT;
var spacedPoints = bezierPath.Points;

var splineLength = GetLinearLength(precision: 0.0001f, useWorldScale: false);
var segmentsCount = Mathf.RoundToInt(splineLength / spacing) + 1;
Expand Down Expand Up @@ -783,7 +799,7 @@ public void GetEvenlySpacedPoints(float spacing, SplinePath bezierPath, float pr
if (isLoop && normals.Count > 1)
{
// Get angle between first and last normal (if zero, they're already lined up, otherwise we need to correct)
float normalsAngleErrorAcrossJoin = Vector3.SignedAngle(normals[normals.Count - 1], normals[0], tangents[0]);
var normalsAngleErrorAcrossJoin = Vector3.SignedAngle(normals[normals.Count - 1], normals[0], tangents[0]);

// Gradually rotate the normals along the path to ensure start and end normals line up correctly
if (Mathf.Abs(normalsAngleErrorAcrossJoin) > MinNormalsAnglesDifference) // don't bother correcting if very nearly correct
Expand All @@ -799,15 +815,9 @@ public void GetEvenlySpacedPoints(float spacing, SplinePath bezierPath, float pr
}
}

bezierPath.Scales = scales.ToArray();
bezierPath.Points = spacedPoints.ToArray();
bezierPath.Normals = normals.ToArray();
bezierPath.Tangents = tangents.ToArray();
bezierPath.ParametersT = parametersT.ToArray();

if (useWorldSpace)
{
for (var i = 0; i < bezierPath.Points.Length; i++)
for (var i = 0; i < bezierPath.Points.Count; i++)
{
bezierPath.Points[i] = transform.TransformPoint(bezierPath.Points[i]);
}
Expand Down Expand Up @@ -1137,11 +1147,14 @@ private void AddPoint(Vector3 point, int index)
{
Points.Add(linePoint);
}

CurvesCount = Mathf.Max(0, (PointsCount - 1) / 3);
}

private void RemovePoint(int pointIndex)
{
Points.RemoveAt(pointIndex);
CurvesCount = Mathf.Max(0, (PointsCount - 1) / 3);
}

private void ApplyContraints(int pointIndex)
Expand Down
55 changes: 34 additions & 21 deletions Runtime/SplinePath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
// </copyright>

using System;
using System.Collections.Generic;
using UnityEngine;

namespace SplineEditor
Expand All @@ -16,37 +17,37 @@ namespace SplineEditor
public class SplinePath
{
[SerializeField]
private Vector3[] scales;
private List<Vector3> scales;
[SerializeField]
private Vector3[] points;
private List<Vector3> points;
[SerializeField]
private Vector3[] normals;
private List<Vector3> normals;
[SerializeField]
private Vector3[] tangents;
private List<Vector3> tangents;
[SerializeField]
private float[] parametersT;
private List<float> parametersT;

/// <summary>
/// Initializes a new instance of the <see cref="SplinePath"/> class.
/// </summary>
public SplinePath()
{
this.Points = new Vector3[0];
this.Normals = new Vector3[0];
this.Tangents = new Vector3[0];
this.Scales = new Vector3[0];
this.ParametersT = new float[0];
this.Points = new List<Vector3>();
this.Normals = new List<Vector3>();
this.Tangents = new List<Vector3>();
this.Scales = new List<Vector3>();
this.ParametersT = new List<float>();
}

/// <summary>
/// Initializes a new instance of the <see cref="SplinePath"/> class.
/// </summary>
/// <param name="points">Array of points positions on path.</param>
/// <param name="tangents">Array of tangents on path.</param>
/// <param name="normals">Array of normal vectors on path.</param>
/// <param name="scales">Array of scales on path.</param>
/// <param name="parametersT">Array of t parameters on path.</param>
public SplinePath(Vector3[] points, Vector3[] tangents, Vector3[] normals, Vector3[] scales, float[] parametersT)
/// <param name="points">List of points positions on path.</param>
/// <param name="tangents">List of tangents on path.</param>
/// <param name="normals">List of normal vectors on path.</param>
/// <param name="scales">List of scales on path.</param>
/// <param name="parametersT">List of t parameters on path.</param>
public SplinePath(List<Vector3> points, List<Vector3> tangents, List<Vector3> normals, List<Vector3> scales, List<float> parametersT)
{
this.Points = points;
this.Normals = normals;
Expand All @@ -58,7 +59,7 @@ public SplinePath(Vector3[] points, Vector3[] tangents, Vector3[] normals, Vecto
/// <summary>
/// Gets or sets scales for path points.
/// </summary>
public Vector3[] Scales
public List<Vector3> Scales
{
get => scales;
set => scales = value;
Expand All @@ -67,7 +68,7 @@ public Vector3[] Scales
/// <summary>
/// Gets or sets positions for path points.
/// </summary>
public Vector3[] Points
public List<Vector3> Points
{
get => points;
set => points = value;
Expand All @@ -76,7 +77,7 @@ public Vector3[] Points
/// <summary>
/// Gets or sets normal vectors for path points.
/// </summary>
public Vector3[] Normals
public List<Vector3> Normals
{
get => normals;
set => normals = value;
Expand All @@ -85,7 +86,7 @@ public Vector3[] Normals
/// <summary>
/// Gets or sets tangents for path points.
/// </summary>
public Vector3[] Tangents
public List<Vector3> Tangents
{
get => tangents;
set => tangents = value;
Expand All @@ -94,10 +95,22 @@ public Vector3[] Tangents
/// <summary>
/// Gets or sets t parameters of bezier spline for path points.
/// </summary>
public float[] ParametersT
public List<float> ParametersT
{
get => parametersT;
set => parametersT = value;
}

/// <summary>
/// Resets all variables to empty lists.
/// </summary>
public void Reset()
{
Scales.Clear();
Points.Clear();
Normals.Clear();
Tangents.Clear();
ParametersT.Clear();
}
}
}
2 changes: 1 addition & 1 deletion Samples/Line Renderer/Runtime/LineRendererSpline.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ private void UpdateLinePointsWithEvenlySpacedPoints()
bezierSpline.GetEvenlySpacedPoints(pointsSpacing, cachedSplinePath, useWorldSpace: false);

var generatedPoints = cachedSplinePath.Points;
var generatedPointsLength = generatedPoints.Length;
var generatedPointsLength = generatedPoints.Count;

lineRenderer.positionCount = generatedPointsLength;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ MonoBehaviour:
pointsColor: {r: 0, g: 0, b: 1, a: 1}
normalsColor: {r: 0, g: 1, b: 0, a: 1}
normalVectorLength: 2.5
useJobsWithCoroutines: 0
2 changes: 1 addition & 1 deletion Samples/Mesh Generator/Editor/SplineMeshEditorState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public void SetDebugModeView(SplineMesh splineMesh, bool state)
/// <param name="splineMesh">SplineMesh component to have UV material set.</param>
public void SetDebugModeMaterial(SplineMesh splineMesh)
{
var settingsScriptable = SplineMeshEditorConfiguration.Instance;
var settingsScriptable = SplineMeshConfiguration.Instance;

var prevMaterial = splineMesh.MeshRenderer.sharedMaterial;
var newMaterial = settingsScriptable.UvMaterial;
Expand Down
2 changes: 1 addition & 1 deletion Samples/Mesh Generator/Editor/SplineMeshEditor_Base.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public partial class SplineMeshEditor : UnityEditor.Editor

private static SplineMeshEditorState MeshEditorState => SplineMeshEditorState.instance;

private static SplineMeshEditorConfiguration MeshEditorConfiguration => SplineMeshEditorConfiguration.Instance;
private static SplineMeshConfiguration MeshEditorConfiguration => SplineMeshConfiguration.Instance;

private void OnEnable()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ private void DrawBakeMeshButton()
GUILayout.Space(20);
if (GUILayout.Button(MeshOptionsBakeMeshButtonContent, buttonStyle, ButtonHeight))
{
splineMesh.ConstructMesh();
splineMesh.GenerateMesh();
var path = EditorUtility.SaveFilePanel(MeshOptionsBakeMeshWindowTitle, MeshOptionsBakeMeshWindowFolderPath, MeshOptionsBakeMeshWindowFileName, MeshOptionsBakeMeshWindowFileExtension);
if (string.IsNullOrEmpty(path))
{
Expand Down
8 changes: 4 additions & 4 deletions Samples/Mesh Generator/Editor/SplineMeshEditor_SceneGUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private void OnSceneGUI()

private void DrawPoints()
{
for (var i = 0; i < splineMesh.Points.Length; i++)
for (var i = 0; i < splineMesh.Points.Count; i++)
{
DrawPoint(i);
}
Expand All @@ -46,7 +46,7 @@ private void DrawPoint(int index)
if (MeshEditorState.DrawPoints)
{
var handleSize = 0.025f;
Handles.color = SplineMeshEditorConfiguration.Instance.PointsColor;
Handles.color = SplineMeshConfiguration.Instance.PointsColor;
Handles.Button(point, Quaternion.identity, size * handleSize, size * handleSize, Handles.DotHandleCap);
}

Expand All @@ -59,8 +59,8 @@ private void DrawPoint(int index)
private void DrawNormal(Vector3 point, int index)
{
var normal = splineMesh.Normals[index];
var normalLength = SplineMeshEditorConfiguration.Instance.NormalVectorLength;
Handles.color = SplineMeshEditorConfiguration.Instance.NormalsColor;
var normalLength = SplineMeshConfiguration.Instance.NormalVectorLength;
Handles.color = SplineMeshConfiguration.Instance.NormalsColor;
Handles.DrawLine(point, point + splineMesh.transform.TransformDirection(normal * normalLength));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public SplineMeshSettingsProvider(string path, SettingsScope scope) : base(path,
[SettingsProvider]
public static SettingsProvider CreateMyCustomSettingsProvider()
{
var settingsScriptable = SplineMeshEditorConfiguration.Instance;
var settingsScriptable = SplineMeshConfiguration.Instance;

if (cachedEditor == null)
{
Expand Down
8 changes: 8 additions & 0 deletions Samples/Mesh Generator/Runtime/Jobs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit dc0fcbe

Please sign in to comment.